-
Ja, es verbindet sich selbst, wenn es initialisiert wird. Technisch gesehen benötigt der dynamische Linker keine Objektauflösung und -verschiebung für sich selbst, da er vollständig aufgelöst wird, aber er definiert Symbole und muss sich um diese kümmern, wenn er die Binärdatei auflöst, die er „interpretiert“, und diese Symbole werden aktualisiert um auf ihre Implementierungen in den geladenen Bibliotheken zu verweisen. Dies betrifft insbesondere
malloc— Der Linker hat eine eingebaute Minimalversion mit dem entsprechenden Symbol, die jedoch nach dem Laden und Verschieben durch die Version der C-Bibliothek ersetzt wird (oder sogar durch eine zwischengeschaltete Version, falls vorhanden), wobei einige Sorgfalt darauf verwendet wird, dies sicherzustellen nicht an einem Punkt passieren, an dem der Linker beschädigt werden könnte.Die blutigen Details sind in
rtld.c, imdl_mainFunktion.Beachten Sie jedoch, dass
ld.sohat keine externen Abhängigkeiten. Sie können die beteiligten Symbole mitnm -Dsehen; keiner von ihnen ist undefiniert. -
Die Manpage verweist nur auf Einträge direkt unter
/lib, d.h./lib/ld.so(der dynamische Linker von libc 5, dera.outunterstützt ) und/lib*/ld-linux*.so*(der dynamische Linker libc 6, der ELF unterstützt). Die Manpage ist sehr spezifisch undld.soist nichtld-2.28.so.Der dynamische Linker, der auf den meisten aktuellen Systemen zu finden ist, enthält
a.outnicht Unterstützung.
file und ldd berichten unterschiedliche Dinge für den dynamischen Linker, weil sie unterschiedliche Definitionen dessen haben, was eine statisch gelinkte Binärdatei ausmacht. Für ldd , eine Binärdatei ist statisch gelinkt, wenn sie kein DT_NEEDED hat Symbole, d.h. keine undefinierten Symbole. Für file , eine ELF-Binärdatei ist statisch gelinkt, wenn sie keinen PT_DYNAMIC hat Abschnitt (dies wird sich in der Veröffentlichung von file ändern nach 5.37; es verwendet jetzt das Vorhandensein eines PT_INTERP Abschnitt als Indikator einer dynamisch verknüpften Binärdatei, die mit dem Kommentar im Code übereinstimmt).
Der dynamische Linker der GNU C-Bibliothek hat keinen DT_NEEDED Symbolen, aber es hat einen PT_DYNAMIC Abschnitt (da es sich technisch gesehen um eine gemeinsam genutzte Bibliothek handelt). Als Ergebnis ldd (das ist der dynamische Linker) gibt an, dass er statisch verlinkt ist, aber file zeigt an, dass es dynamisch verknüpft ist. Es hat keinen PT_INTERP Abschnitt, also die nächste Version von file zeigt auch an, dass es statisch verknüpft ist.
$ ldd /lib64/ld-linux-x86-64.so.2
statically linked
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(mit file 5.35)
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(mit der derzeit in Entwicklung befindlichen Version von file ).