首页 > 解决方案 > 如何知道程序调用了库的哪些函数

问题描述

假设我有二进制库 (*.so) 和一个使用该库的二进制程序(即我不拥有这两个库的源代码)。

如何找出在运行时调用了哪些库函数。我想知道他们的名字,但不需要实时信息。

这两个二进制文件都不包含调试符号。

标签: c++clinuxshared-libraries

解决方案


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 列中代码的含义,这些代码指定了外部符号引用的类型。在这里,看起来我们会对DFs 感兴趣,表示动态函数调用。在这里,我们看到一些熟悉的 C 库函数,如getenv()and sigprocmask(),被 `/bin/ls.

无法识别的库调用可能是头文件中的内部宏使用库的内部实现细节的结果。这可能就是“__ctype_toupper_loc”的全部意义所在。

当将此与 C++ 代码一起使用时,您还需要指定-C选项,以对 C++ 符号进行分解。

当然,特定二进制文件携带对某个库函数的外部引用这一事实并不能保证二进制文件会在运行时实际调用它。


推荐阅读