2009-04-30 9 views
8

Gibt es eine Möglichkeit, die Objektdateien zu finden, aus denen die aktuelle ausführbare Datei unter Linux generiert wird (RHEL, um genau zu sein). Ich verstehe, dass man "nm" verwenden kann, um die exportierten Symbole zu finden, "ldd", um abhängiges gemeinsames Objekt zu finden.Objektdateien in einer ausführbaren Datei unter Linux

Aber ich konnte Befehl nicht finden, um den Namen von Objekt (.o) Dateien herauszufinden, aus denen ausführbare Datei besteht. Ist es möglich?

Antwort

6

Wenn es mit Debugging-Informationen ja kompiliert wurde. Verwenden Sie gdb (man gdb), um die Informationen zu finden.

Wenn es nicht ohne Debug-Informationen kompiliert wurde. Du hast kein Glück.

1

Neben nullptr „shared object“ bezieht sich auf andere gemeinsam genutzte Bibliotheken (verlinkt), nicht auf die Originalobjekte (nicht verbunden)

1

Sie auch objdump (solange die ausführbare Datei und Objekte mit wurden zusammengestellt verwenden können Debug-Informationen):

# gcc -g -c -o /tmp/some_object.o /tmp/some_object.c 
# gcc -g -o /tmp/file /tmp/file.c /tmp/some_object.o 
# objdump -g /tmp/file | awk 'BEGIN{out=0} /Directory Table/{out=1} /Line Number Statements/{out=0} {if(out){print $0}}' 
The Directory Table (offset 0x1b): 
    1  /tmp 

The File Name Table (offset 0x21): 
    Entry Dir  Time Size Name 
    1  1  0  0  file.c 

The Directory Table (offset 0x5a): 
    1  /tmp 

The File Name Table (offset 0x60): 
    Entry Dir  Time Size Name 
    1  1  0  0  some_object.c 

awk ist nur zu extrahieren die relevanten Informationen verwendet (wenn Sie nicht verwenden, werden Sie die vollständige Debug-Informationen in der ausführbaren Datei und Objekte erhalten).

4

Die ursprünglichen Namen der Objektdateien werden nicht in den DWARF-Debuginformationen gespeichert.

Jede Objektdatei hat einen DW_TAG_compile_unit Eintrag im Bereich .debug_info. Dieser Eintrag enthält einen Verweis auf die "primäre Quelldatei , von der die Übersetzungseinheit abgeleitet wurde", nicht aber den Namen der Objektdatei. The DWARF standard enthält eine Liste der Attribute, die für jede Kompilierungseinheit gespeichert werden können (Abschnitt 3.1.1, Seite 44, pdf Seite 58).

Sie können die Informationen anzeigen, die mit dem folgenden Befehl gespeichert ist:

$ readelf --debug-dump=info --dwarf-depth=1 hw 

Ausgang:

Contents of the .debug_info section: 
<some compilation units removed>  
    Compilation Unit @ offset 0x133: 
    Length:  0x8b (32-bit) 
    Version:  4 
    Abbrev Offset: 0x64 
    Pointer Size: 4 
<0><13e>: Abbrev Number: 1 (DW_TAG_compile_unit) 
    <13f> DW_AT_producer : (indirect string, offset: 0x131): GNU C11 5.3.0 -mtune=generic -march=pentiumpro -g 
    <143> DW_AT_language : 12  (ANSI C99) 
    <144> DW_AT_name  : (indirect string, offset: 0x163): hw.c 
    <148> DW_AT_comp_dir : (indirect string, offset: 0x168): /home/mikel/src/hw 
    <14c> DW_AT_low_pc  : 0x80483db 
    <150> DW_AT_high_pc  : 0x2e 
    <154> DW_AT_stmt_list : 0xea 
<1><158>: ... 
<some compilation units removed> 
1

Eine Objektdatei in einem ausführbaren übersetzt nach der Linksetzung. Wenn die Verknüpfung geteilt wird, können Sie dies über gemeinsam genutzte Bibliotheken (ldd) erreichen. Wenn die Verknüpfung jedoch statisch ist, gibt es nur einen Weg, d. H. Über Debug-Informationen. Sie können debuginfo-Pakete in RHEL (oder Fedora) installieren. Hier sind die Anweisungen

Und dann verwenden gdb info sources wie hier beschrieben:

Dies würde Ihnen eine l ist der Quelldateien. Um die Objektdateien tatsächlich zu erhalten, müssen Sie jedoch die Build-Tools genauer betrachten (rpmbuild).Und tatsächlich rpmbuild laufen würden Sie den Quell-RPM-Paket benötigen, die Sie erhalten, können Sie den Anweisungen unter Verwendung von hier aufgelistet:

Jetzt können Sie das Paket selbst bauen und sezieren die .o Datei resultierten in die ausführbare Datei.

Ich hoffe, dass hilft.