如何查看Linux .so或.a对象的内部并查看它们包含哪些函数
How can I look inside a Linux .so or .a object and see what functions they contain?
链接器大概可以做到这一点,那么是否有一个命令行工具来列出目标文件中的函数并告诉我函数的名称和它们的签名?
对于共享库,您必须使用:
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文件中的函数和变量
相关文章:
- 当包含成员函数名为errno和cerrno时,g++7编译错误
- 重载运算符主体仅包含一个函数调用
- std::包含 std::函数回调的多个包装器的向量不起作用
- 扩展包含静态函数的类
- 我有一个包裹的矢量.我该如何判断它包含哪种类型
- c++如何在特定文件中包含所有函数而不包含该文件
- new[] 一个包含构造函数的字节对象数组没有错,对吧?
- 使用头文件中包含的函数时未定义的引用
- 派生类是否C++必须在头文件中包含继承函数/成员的定义
- 匿名命名空间,用于在两个 cpp 文件中包含一个函数
- 包含虚函数的类可以成为单例
- 返回包含从函数捕获的 lambda
- 如何在单独的文件中包含全局函数
- 当包含全局函数时,c++错误lnk2005
- 与包含复杂函数的内联
- C++,OpenCV:不能包含Cvtcolor函数的imgproc库
- Eclipse CDT - 编辑器无法识别静态库中包含的函数
- 是否可以接受不在标头中包含所有函数声明以创建"private namespace"?
- C++:是否有一个包含各种函数的traits类来操作以零结尾的char*和wchar_t*字符串
- 使用多态基类(包含虚函数)访问数组元素时的类型