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

110

我该如何查看.o文件中的符号?nm命令对我没用。我使用g++/linux。


5
“nm”恰好是你需要使用的。你能解释一下为什么它对你不起作用吗? - nos
1
它说:nm: Lib1.o: 文件格式无法识别 - nakiya
4
运行命令 file Lib1.o 并告诉我们输出结果是什么。 - DarkDust
4
@nakiya,你无法运行一个 .o 文件。如果你编译一个头文件,使用最近版本的 GCC 会生成预编译头文件,而不是目标文件。你应该编译 .cpp 文件而不是头文件。 - nos
2
@nakiya:你不能运行它,应该在你的shell中真正输入文本"file Lib1.o"。叫做file的工具告诉你Lib1.o的文件类型,即它是否真的是一个目标文件。我怀疑它不是。 - DarkDust
显示剩余3条评论
5个回答

129

你可以使用强大的objdump代替nm。有关详细信息,请参见man页面。尝试 objdump -t myfileobjdump -T myfile。使用-C标志,您还可以解除像nm一样的C++名称修饰。


2
我也尝试了ObjDump。结果相同: objdump: Lib1.o: 文件格式无法识别 - nakiya
4
请尝试运行命令 objdump -t Lib1.o - mustafa

17

您是否使用了另一个平台的交叉编译器?如果是,就需要使用相应的nmobjdump命令。

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


7
只需运行:nm your_obj_file.o | c++filt

4

有一个命令可以查看目标文件、库文件或可执行文件中包含哪些函数:

nm

8
楼主直接表明无法使用 nm - ivan_pozdeev
1
@ivan_pozdeev 虽然这是正确的,但我想有些人(至少包括我)只是通过搜索如何查看目标文件中的符号来到这个问题,而在我的情况下,nm 完全满足了我的需求,所以我认为在这种情况下这是一个很好的答案。 - Newbyte

3
您可以使用 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,那么使用nm -C会更易读。

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接