2013-11-14 11 views
23

Als ich ldd program laufen bekomme ich eine Ausgabe des FormularsWas sind ld-linux.so.2 und linux-gate.so.1?

linux-gate.so.1 => (0xb77ae000) 
    libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000) 
    libm.so.6 => /lib/libm.so.6 (0xb7691000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000) 
    libc.so.6 => /lib/libc.so.6 (0xb74c2000) 
    /lib/ld-linux.so.2 (0xb77af000) 

können Sie die Ausgabe und den Grund linux-gate.so.1 und ld-linux.so.2 zeigen anders als andere Einträge erklären? Was sind ihre Rollen?

Antwort

40

Ich hoffe, dass Sie nicht nach den Haupteinträgen fragen, die sagen, dass für die angeforderte Bibliothek libm.so.6 es in der Datei /lib/libm.so.6 zum Beispiel gefunden wurde, aber nach den zwei Ausreißern fragen.

Warum sind sie anders angezeigt? für linux-gate.so.1 ist es, weil es nicht wirklich eine Datei auf der Festplatte ist - es wird durch den Kernel als der Mechanismus zum Ausführen von Systemaufrufen ausgesetzt. Für /lib/ld-linux.so.2 ist es, weil dies die Programm Interpreter ist, die für tatsächlich Ausführen der Anwendung verwendet wird.

Es ist eine ziemlich gute blog entry die linux-gate.so beschreiben, und es es ziemlich gut erklärt.

Für /lib/ld-linux.so.2, müssen Sie ein wenig von dem verstehen, was passiert, wenn Sie ein ELF-Binaries starten. Die kurze Antwort ist, dass der Kernel-Handler für diese Arten von Binärdateien diese Datei zum Starten der Anwendung verwendet.

Der Hauptzweck dieses Programms besteht darin, die Binärdatei in den Speicher abzulegen, alle referenzierten Bibliotheken in das Programm zu laden (z. B. die zuvor erwähnte libm.so.6) und dann die Steuerung an die Startadresse der Binärdatei zu übergeben hingerichtet.

Dieses Programm ist als Teil der Struktur der ELF-Datei im Bereich INTERP des Programmheaders definiert. Für 32-Bit-Linux-Binärdateien ist dies der typische Name des 32-Bit-Interpreters. Für 64-Bit-Binärdateien finden Sie in der Regel ld-linux-x86_64.so.2 (für 64-Bit x86-Plattformen).

können Sie diese Informationen selbst bestimmen readelf -l verwenden und die INTERP Abschnitt:

INTERP   0x0000000000000238 0x0000000000400238 0x0000000000400238 
       0x000000000000001c 0x000000000000001c R  1 
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 
+0

„Laufzeit-Interpreter“? Kannst du bitte näher darauf eingehen? –

+2

Entschuldigungen, der Fachbegriff ist * Programm * Dolmetscher - ich habe einen Absatz hinzugefügt meiste Arbeit Detaillierung, die es tut – Petesh

+0

Vielen Dank, das ist aufräumt genau die Verwirrung ich :) Ziel war. Fabelhaft, dass Sie auch erklären, wie die Verwirrung bei der Betrachtung der ELF-Abschnitte entstehen könnte, wusste ich nicht. –