Як переглянути символи в об'єктних файлах?


83

Як я можу переглянути символи у файлі .o? nm у мене не працює. Я використовую g ++ / linux.


5
nm - це саме те, що ви використовуєте. Чи можете ви пояснити, як це у вас не працює?
nos

1
Там написано:nm: Lib1.o: File format not recognized
nakiya

4
@nakiya: Запусти file Lib1.oі скажи нам, який результат.
DarkDust

4
@nakiya Ви не можете запустити файл .o. І якщо ви компілюєте файл заголовка, ви створюєте попередньо скомпільовані заголовки з останніми версіями gcc, а не об'єктні файли. Вам слід скомпілювати файли .cpp, а не заголовки.
nos

1
@nakiya: Ви не можете запустити його, вам дійсно слід " file Lib1.o" ввести текст у свою оболонку. Інструмент, що називається, fileповідомляє вам тип файлу Lib1.o, тобто чи справді це об’єктний файл. Я сумніваюся.
DarkDust

Відповіді:


101

Замість nm, ви можете використовувати потужні objdump. Докладнішу інформацію див. На сторінці користувача. Спробуйте objdump -t myfileабо objdump -T myfile. За допомогою -Cпрапора ви також можете деменгувати імена C ++, як nmце робить.


1
Я також спробував ObjDump. Той самий результат:objdump: Lib1.o: File format not recognized
nakiya

2
спробуйobjdump -t Lib1.o
мустафа

13

Чи використовували ви крос-компілятор для іншої платформи? Якщо так, то потрібно скористатися відповідною nmабо objdumpкомандою.

Наприклад, якщо ви використовували XXX-YYY-gccдля компіляції файл .o, вам потрібно використовувати XXX-YYY-nmабо XXX-YYY-objdumpобробити файли.



4

Існує команда, щоб подивитися, які функції входять до об’єктного файлу, бібліотеки чи виконуваного файлу:

nm

4
ОП прямо заявив, що він не може використовувати nm.
ivan_pozdeev

2

Ви можете використовувати nm -C .o/lib/exe, наприклад:

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

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

nm -Cйого використання буде зручнішим для читання , якщо ви просто використовуєте nm:

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

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

як ми бачимо, це не так читабельно.

Нижче ось що мені file1.cppподобається:

xiongyu@ubuntu:~/tmp/build$ vi ../file1.cpp 
#include "head.h"
void f()  {
     int i = fun<int>(42);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.