如何知道程序调用了库的哪些函数

hig*_*guy 6 c c++ linux shared-libraries

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

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

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

Sam*_*hik 4

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
...
Run Code Online (Sandbox Code Playgroud)

等等。转储包括所有外部符号引用,而不仅仅是函数。手册页解释了第二列中代码的含义,这些代码指定了外部符号引用的类型。在这里,看起来我们会对DFs 感兴趣,表示动态函数调用。在这里,我们看到一些熟悉的 C 库函数,例如getenv()sigprocmask(),被 `/bin/ls 引用。

无法识别的库调用可能是头文件中的内部宏使用库的内部实现细节造成的。这可能就是“__ctype_toupper_loc”的全部内容。

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

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