Как просмотреть символы в объектных файлах?

Как просмотреть символы в файле .o? нм у меня не работает. Я использую g++/linux.


person nakiya    schedule 07.10.2010    source источник
comment
nm - это именно то, что вы бы использовали. Можете ли вы объяснить, как это не работает для вас?   -  person nos    schedule 07.10.2010
comment
Там написано: nm: Lib1.o: File format not recognized   -  person nakiya    schedule 07.10.2010
comment
@nakiya: Запустите file Lib1.o и сообщите нам результат.   -  person DarkDust    schedule 07.10.2010
comment
Я построил объектный файл прямо из заголовка, где была реализация. Это как-то связано с этим?   -  person nakiya    schedule 07.10.2010
comment
@DarkDust: Как запустить объектный файл?   -  person nakiya    schedule 07.10.2010
comment
@nakiya Вы не можете запустить файл .o. И если вы компилируете файл заголовка, вы создаете предварительно скомпилированные заголовки с последними версиями gcc, а не объектные файлы. Вы должны компилировать файлы .cpp, а не файлы заголовков.   -  person nos    schedule 07.10.2010
comment
@nakiya: Вы не можете запустить его, вы действительно должны ввести текст file Lib1.o в своей оболочке. Инструмент под названием file сообщает вам тип файла Lib1.o, то есть действительно ли это объектный файл. Я сомневаюсь в этом.   -  person DarkDust    schedule 07.10.2010
comment
Ага. : Д. Он говорит, что это предварительно скомпилированный заголовок. Я перекомпилировал с реализацией в файле cpp.   -  person nakiya    schedule 07.10.2010


Ответы (5)


Вместо nm вы можете использовать мощный objdump. Подробности смотрите на справочной странице. Попробуйте objdump -t myfile или objdump -T myfile. С флагом -C вы также можете демангелизировать имена C++, как это делает nm.

person DarkDust    schedule 07.10.2010
comment
Я также пробовал ObjDump. Тот же результат: objdump: Lib1.o: File format not recognized - person nakiya; 07.10.2010
comment
попробуй objdump -t Lib1.o - person mustafa; 23.04.2014

Вы использовали кросс-компилятор для другой платформы? Если это так, вам нужно использовать соответствующую команду nm или objdump.

Например, если вы использовали XXX-YYY-gcc для компиляции файла .o, вам нужно использовать XXX-YYY-nm или XXX-YYY-objdump для обработки файлов.

person Schedler    schedule 07.10.2010

Существует команда, чтобы посмотреть, какие функции включены в объектный файл, библиотеку или исполняемый файл:

nm
person Alok Save    schedule 07.10.2010
comment
ОП прямо заявил, что не может использовать nm. - person ivan_pozdeev; 14.03.2016

Просто запустите: nm you_obj_file.o | c++filt

person Jee lee    schedule 30.12.2016

Вы можете использовать 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);
}
person Jayhello    schedule 29.09.2018