c++ - 如何知道程序调用了库的哪些函数
问题描述
假设我有二进制库 (*.so) 和一个使用该库的二进制程序(即我不拥有这两个库的源代码)。
如何找出在运行时调用了哪些库函数。我想知道他们的名字,但不需要实时信息。
这两个二进制文件都不包含调试符号。
解决方案
objdump命令从二进制文件中转储外部符号引用。典型的用例涉及使用-T
选项运行它,以转储二进制文件的外部符号引用。
例如,运行objdump -T
在/bin/ls
:
/bin/ls: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3 __ctype_toupper_loc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getenv
0000000000000000 DF *UND* 0000000000000000 cap_to_text
0000000000000000 DO *UND* 0000000000000000 GLIBC_2.2.5 __progname
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 sigprocmask
...
等等。转储包括所有外部符号引用,而不仅仅是函数。手册页解释了第 2 列中代码的含义,这些代码指定了外部符号引用的类型。在这里,看起来我们会对DF
s 感兴趣,表示动态函数调用。在这里,我们看到一些熟悉的 C 库函数,如getenv()
and sigprocmask()
,被 `/bin/ls.
无法识别的库调用可能是头文件中的内部宏使用库的内部实现细节的结果。这可能就是“__ctype_toupper_loc”的全部意义所在。
当将此与 C++ 代码一起使用时,您还需要指定-C
选项,以对 C++ 符号进行分解。
当然,特定二进制文件携带对某个库函数的外部引用这一事实并不能保证二进制文件会在运行时实际调用它。
推荐阅读
- swift - Overriding UILabel text getter not working
- aws-lambda - AWS lambda serverless `schedule` 事件创建错误:LimitExceededException
- mysql - MySql中带有分组语句的两个不同表的总和差异
- sql - SQL:在第一个匹配行条件下连接 2 个表
- mysql-workbench - MYSQL怎么看一个表?
- android - 在 ViewSwitcher 中使用 EditText 并不能使其在第一次触摸时可编辑
- java - 行动的堆叠本质
- java - 方法调用时的类型转换
- node.js - 运行 create-react-app 时终端出错
- python-3.x - 在同一行加入随机字符密码