【问题标题】:count of external symbol usages by shared library共享库使用的外部符号计数
【发布时间】:2013-08-11 07:23:31
【问题描述】:

我想找到一些外部符号,由一个共享库 (.so) 在另一个共享库 (.so) 中使用。我可以轻松跑

 nm -D ./lib_the_one.so

并通过grep获取使用的符号列表,例如'U'(未定义的符号):

          U The_external_symbol

现在我想知道,在整个库“lib_the_one.so”中(静态)存在多少个符号的用法。更准确地说,

  • 某些外部函数有多少直接调用
  • 外部变量被引用了多少次

例如,我想知道我的“lib_the_one.so”中有 10 个函数调用了 calloc,其中 5 个函数调用了 malloc

如何使用 nm、objdump 或任何其他实用程序 binutils(我的操作系统是 Linux)来做到这一点?

【问题讨论】:

    标签: linux shared-libraries binutils nm


    【解决方案1】:

    你可以在每个符号上使用objdumpgrep,它应该给你一个符号被引用的次数,这里我从两个不同的函数调用malloc两次:

    objdump  -D test_prog | grep malloc
    0000000000400928 <malloc@plt>:
    400b91: e8 92 fd ff ff          callq  400928 <malloc@plt>
    400c9c: e8 87 fc ff ff          callq  400928 <malloc@plt>
    

    注意:忽略第一个它是 plt 条目。

    【讨论】:

    • mux,嗯,你能在 objdump 的源代码中显示它是如何将地址 400928 转换为符号名称@plt 的吗?
    • @osgx 没有,但我猜它在符号表中查找。
    • @osgx 实际上,如果您将符号的索引(来自符号表 .dynsym)乘以每个条目的大小(16 个字节),然后将其添加到 plt 的地址(来自 readelf ) 你得到那个符号的地址。我猜这就是 objdump 的做法。
    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2011-02-28
    • 2011-03-22
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多