Jak przeglądać symbole w plikach obiektowych?

83

Jak mogę wyświetlić symbole w pliku .o? nm nie działa dla mnie. Używam g ++ / linux.

nakiya
źródło
5
nm jest dokładnie tym, czego użyjesz. Czy możesz wyjaśnić, dlaczego to nie działa dla Ciebie?
nr
1
Mówi:nm: Lib1.o: File format not recognized
nakiya
4
@nakiya: Uruchom file Lib1.oi powiedz nam, jakie jest wyjście.
DarkDust
4
@nakiya Nie możesz uruchomić pliku .o. A jeśli kompilujesz plik nagłówkowy, tworzysz prekompilowane nagłówki z ostatnimi wersjami gcc, a nie z plikami obiektowymi. Powinieneś kompilować pliki .cpp, a nie pliki nagłówkowe.
nr
1
@nakiya: Nie możesz go uruchomić, naprawdę powinieneś wpisać tekst „ file Lib1.o” w swojej powłoce. fileWywołane narzędzie podaje typ pliku Lib1.o, tzn. Czy jest to naprawdę plik obiektowy. Wątpię.
DarkDust

Odpowiedzi:

101

Zamiast tego nmmożesz użyć potężnego objdump. Zobacz stronę podręcznika po szczegóły. Spróbuj objdump -t myfilelub objdump -T myfile. Za pomocą tej -Cflagi możesz także rozróżniać nazwy C ++, tak jak nmrobi.

DarkDust
źródło
1
Próbowałem też ObjDump. Ten sam wynik:objdump: Lib1.o: File format not recognized
nakiya
2
spróbujobjdump -t Lib1.o
mustafa
13

Czy korzystałeś z cross-kompilatora dla innej platformy? Jeśli tak, musisz użyć odpowiedniego nmlubobjdump .

Na przykład, jeśli XXX-YYY-gccskompilowałeś plik .o, musisz użyć XXX-YYY-nmlub XXX-YYY-objdumpprzetworzyć te pliki.

Schedler
źródło
5

Po prostu biegnij: nm you_obj_file.o | c++filt

Jee lee
źródło
4

Istnieje polecenie, aby sprawdzić, które funkcje są zawarte w pliku obiektowym, bibliotece lub pliku wykonywalnym:

nm
Alok Save
źródło
4
OP stwierdził wprost, że nie może korzystać nm.
ivan_pozdeev
2

Możesz użyć nm -C .o/lib/exenp .:

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

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

używanie nm -Cgo będzie bardziej czytelne , jeśli użyjesz tylko nm:

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

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

jak widzimy, nie jest tak czytelny.

Poniżej przedstawiam to, co mi się file1.cpppodoba:

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