-
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_main
Funktion.Beachten Sie jedoch, dass
ld.so
hat keine externen Abhängigkeiten. Sie können die beteiligten Symbole mitnm -D
sehen; 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.out
unterstützt ) und/lib*/ld-linux*.so*
(der dynamische Linker libc 6, der ELF unterstützt). Die Manpage ist sehr spezifisch undld.so
ist nichtld-2.28.so
.Der dynamische Linker, der auf den meisten aktuellen Systemen zu finden ist, enthält
a.out
nicht 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
).