【问题标题】:How can I look inside a Linux .so or .a object and see what functions they contain?如何查看 Linux .so 或 .a 对象的内部并查看它们包含哪些功能?
【发布时间】:2016-12-17 15:51:38
【问题描述】:

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

【问题讨论】:

    标签: c++ c unix static-libraries


    【解决方案1】:

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

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

    没有-Dnm 转储调试符号; -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。符号就是符号;如果这些文件被剥离,这些对象就不能用于链接。

    this similar question中所述:

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

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

    【讨论】:

    • U、R、T 各解释什么? (你这里只有T)
    • @klenteed R 表示符号位于只读数据段中。 U 表示未定义的符号(引用必须来自其他地方的符号)。 T 表示符号在文本部分(即代码)中。
    【解决方案2】:

    您可以使用nm Linux.so,它会显示 .so 文件中的函数和变量。

    【讨论】:

    • 同样适用于.o.a(静态存档)文件。有一些选项可以告诉您.a 文件中的哪些目标文件也包含哪些符号。
    • 需要-D 标志用于.so 文件
    猜你喜欢
    • 2021-11-06
    • 2020-07-17
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2020-02-27
    相关资源
    最近更新 更多