Wie werden Symbole in Objektdateien angezeigt?

83

Wie kann ich Symbole in einer .o-Datei anzeigen? nm funktioniert bei mir nicht. Ich benutze g ++ / linux.

Nakiya
quelle
5
nm ist genau das, was Sie verwenden würden. Können Sie erklären, wie es bei Ihnen nicht funktioniert?
Nr.
1
Es heißt:nm: Lib1.o: File format not recognized
Nakiya
4
@nakiya: Laufen Sie file Lib1.ound sagen Sie uns, was die Ausgabe ist.
DarkDust
4
@nakiya Sie können keine .o-Datei ausführen. Und wenn Sie eine Header-Datei kompilieren, erstellen Sie vorkompilierte Header mit den neuesten gcc-Versionen, keine Objektdateien. Sie sollten CPP-Dateien kompilieren, keine Header-Dateien.
Nr.
1
@nakiya: Du kannst es nicht ausführen, du solltest wirklich den Text " file Lib1.o" in deine Shell eingeben . Das aufgerufene Tool fileteilt Ihnen den Dateityp von Lib1.o mit, dh ob es sich wirklich um eine Objektdatei handelt. Das bezweifle ich.
DarkDust

Antworten:

101

Stattdessen nmkönnen Sie die mächtigen verwenden objdump. Weitere Informationen finden Sie in der Manpage. Versuchen Sie es objdump -t myfileoder objdump -T myfile. Mit dem -CFlag können Sie auch C ++ - Namen entwirren, wie dies der nmFall ist.

DarkDust
quelle
1
Ich habe auch ObjDump ausprobiert. Gleiches Ergebnis:objdump: Lib1.o: File format not recognized
Nakiya
2
versuchen Sieobjdump -t Lib1.o
mustafa
13

Haben Sie einen Cross-Compiler für eine andere Plattform verwendet? In diesem Fall müssen Sie den entsprechenden Befehl nmoder objdumpBefehl verwenden.

Wenn Sie beispielsweise XXX-YYY-gccdie .o-Datei kompiliert haben , müssen Sie die Dateien verwenden XXX-YYY-nmoder XXX-YYY-objdumpverarbeiten.

Schedler
quelle
5

Renn einfach: nm you_obj_file.o | c++filt

Jee Lee
quelle
4

Es gibt einen Befehl, um zu überprüfen, welche Funktionen in einer Objektdatei, Bibliothek oder ausführbaren Datei enthalten sind:

nm
Alok Speichern
quelle
4
Das OP erklärte direkt, dass er nicht verwenden kann nm.
ivan_pozdeev
2

Sie können nm -C .o/lib/exezum Beispiel verwenden:

xiongyu@ubuntu:~/tmp/build$ nm -C libfile1.a 

file1.cpp.o:
0000000000000000 T f()
0000000000000000 W int fun<int>(int)

Die Verwendung nm -Cist besser lesbar , wenn Sie nur Folgendes verwenden nm:

xiongyu@ubuntu:~/tmp/build$ nm libfile1.a 

file1.cpp.o:
0000000000000000 T _Z1fv
0000000000000000 W _Z3funIiET_S0_

wie wir sehen ist es nicht so lesbar.

Unten ist was mir file1.cppgefällt:

xiongyu@ubuntu:~/tmp/build$ vi ../file1.cpp 
#include "head.h"
void f()  {
     int i = fun<int>(42);
}
Jayhello
quelle