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.


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.


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.



4

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

nm

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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.