Fragen? Antworten! Siehe auch: Alternativlos
Nein. Tut es leider nicht. Weak Symbols sind etwas anderes und haben nichts mit der Selektion zu tun, aus welcher Library ein Objekt kommt, sondern ob überhaupt ein Objekt für ein Symbol gesucht wird.
Der Mechanismus könnte zur Not auch hier adaptiert werden, das funktioniert dann ungefähr so:
In der libc hast du Funktion fopen, die ruft fopen_init auf, was weak definiert ist.
In libpthread hast du Funktion fopen_init nicht weak, aber die wird dann nicht reingezogen, außer sie ist in einem Objekt, das aus anderen Gründen eh reingezogen wird. Ich könnte das also in dasselbe Objekt tun, in dem auch pthread_create drin ist. Wenn dann jemand einen Thread erzeugt, dann linkt er auch das fopen_init aus libpthread rein, und das aus libc wird nicht mehr angesprungen.
Warum mache ich das also nicht einfach so?
Weil dietlibc angetreten ist, um Bloat zu sparen. Wenn ich das so mache, dann habe ich erstens in dem Object aus libc immer noch die fopen_init-Funktion drin, die jetzt keiner mehr aufruft. In dem Fall vielleicht nicht so schlimm, weil die Funktion aus libpthread die über einen Alias aufrufen könnte.
Aber anders herum: Wenn jemand pthread_create macht aber nie fopen aufrufen wollte, hat er dann trotzdem fopen_init drin. Das ist genau das Gegenteil dessen, was dietlibc erreichen will. Ich will gerne jedes Byte nicht im Binary drinnen haben, das nicht gebraucht wird, und suche daher die ganze Zeit nach Linker-Tricks, mit denen ich das erreichen kann.
dietlibc verwendet im Moment Weak Symbols, ihr könnt ja mal nach weak greppen im Source Tree. Das kann man schon einsetzen, aber man muss dann vorsichtig und mit Bedacht vorgehen, sonst ist man in Nullkommanichts genau so bloatig wie glibc.