如何查看目标文件中的符号?


81

如何查看.o文件中的符号?nm对我不起作用。我使用g ++ / linux。


5
nm正是您要使用的。您能解释一下它对您不起作用吗?

1
它说:nm: Lib1.o: File format not recognized
nakiya

4
@nakiya:运行file Lib1.o并告诉我们输出是什么。
DarkDust

4
@nakiya您无法运行.o文件。而且,如果编译头文件,则会生成具有最新gcc版本的预编译头,而不是目标文件。您应该编译.cpp文件而不是头文件。

1
@nakiya:您无法运行它,应该file Lib1.o在外壳中真正键入文本“ ”。名为的工具会file告诉您Lib1.o的文件类型,即它是否确实是目标文件。我对此表示怀疑。
DarkDust 2010年

Answers:


100

相反nm,您可以使用功能强大的objdump。有关详细信息,请参见手册页。尝试objdump -t myfileobjdump -T myfile。使用该-C标志,您也可以像这样nm对C ++名称进行解密。


1
我也尝试过ObjDump。同样的结果:objdump: Lib1.o: File format not recognized
nakiya

2
试试objdump -t Lib1.o
mustafa 2014年

13

您是否一直在将交叉编译器用于另一个平台?如果是这样,则需要使用相应的nm或命令objdump

例如,如果您曾经XXX-YYY-gcc编译过.o文件,则需要使用XXX-YYY-nmXXX-YYY-objdump处理这些文件。




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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.