GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann der dynamische Linker/Loader selbst dynamisch gelinkt werden, wie von `file` gemeldet?

  1. 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 , im dl_main Funktion.

    Beachten Sie jedoch, dass ld.so hat keine externen Abhängigkeiten. Sie können die beteiligten Symbole mit nm -D sehen; keiner von ihnen ist undefiniert.

  2. Die Manpage verweist nur auf Einträge direkt unter /lib , d.h. /lib/ld.so (der dynamische Linker von libc 5, der a.out unterstützt ) und /lib*/ld-linux*.so* (der dynamische Linker libc 6, der ELF unterstützt). Die Manpage ist sehr spezifisch und ld.so ist nicht ld-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 ).


Linux
  1. Wie finde ich die Version von Fedora, die ich verwende?

  2. Wie können Sie installierte Versionen der glibc-Bibliotheken ermitteln?

  3. Wie kann ich in einem SIGILL-Handler die anstößige Anweisung überspringen?

  4. Wie kann ich PHP-Code von der Kommandozeile aus ausführen?

  5. Wie kann ich dem Anfang jeder Zeile in einer Datei eine Zeichenfolge voranstellen?

So installieren Sie den IonCube Loader unter Ubuntu Linux

Wie kann ich die Größe von Dateien und Verzeichnissen in Linux sehen?

Wie kann ich Docker-Linux-Containerinformationen aus dem Container selbst abrufen?

Wie kann ich den absoluten Pfad eines laufenden Prozesses erfahren?

Wie kann ich den $PATH unter Linux bearbeiten?

Wie finde ich die älteste Datei in einem Verzeichnisbaum?