如何查看Linux .so或.a对象的内部并查看它们包含哪些函数

How can I look inside a Linux .so or .a object and see what functions they contain?

本文关键字:包含哪 函数 内部 so Linux 何查看 对象      更新时间:2023-10-16

链接器大概可以做到这一点,那么是否有一个命令行工具来列出目标文件中的函数并告诉我函数的名称和它们的签名?

对于共享库,您必须使用:

nm -D /path/to/libwhatever.so.<num>

没有-D, nm转储调试符号;-D是指实际用于动态链接的动态符号。从Ubuntu 12会话:

$ nm /lib/i386-linux-gnu/libc.so.6 
nm: /lib/i386-linux-gnu/libc.so.6: no symbols
$ nm -D /lib/i386-linux-gnu/libc.so.6 | tail
0011fc20 T xdr_wrapstring
001202c0 T xdrmem_create
00115540 T xdrrec_create
001157f0 T xdrrec_endofrecord
00115740 T xdrrec_eof
00115690 T xdrrec_skiprecord
00120980 T xdrstdio_create
00120c70 T xencrypt
0011d330 T xprt_register
0011d450 T xprt_unregister

在这个系统上libc.so被去掉了调试符号,所以nm什么也没有显示;当然,nm -D所揭示的动态链接机制也有符号。

对于.a归档文件或.o对象文件,只需nm。符号就是符号;如果这些文件被剥离,则这些对象不能用于链接。

在这个类似的问题中:

导出符号用T表示。必须从其他共享对象加载的必需符号具有U。注意,符号表不仅包括函数,还包括导出的变量。

或者如果您只想查看导出的符号,请添加--defined-only标志。例:nm -D --defined-only /lib/libtest.so

你可以选择nm Linux.so,它会显示。so文件中的函数和变量