假设我有二进制库 (*.so) 和使用该库的二进制程序(即我不拥有其中任何一个的源代码)。
如何找出在运行时调用了哪些库函数。我想知道他们的名字,但不需要实时信息。
这两个二进制文件都不包含调试符号。
The objdump https://sourceware.org/binutils/docs/binutils/objdump.html命令从二进制文件转储外部符号引用。典型的用例涉及运行它-T
选项,转储二进制文件的外部符号引用。
例如,运行objdump -T
on /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
...
等等。转储包括所有外部符号引用,而不仅仅是函数。手册页解释了第二列中代码的含义,这些代码指定了外部符号引用的类型。在这里,看起来我们会感兴趣DF
s,表示动态函数调用。在这里,我们看到一些熟悉的 C 库函数,例如getenv()
and sigprocmask()
,由`/bin/ls 引用。
无法识别的库调用可能是头文件中的内部宏使用库的内部实现细节造成的。这可能就是“__ctype_toupper_loc”的全部内容。
当将其与 C++ 代码一起使用时,您还需要指定-C
选项,用于分解 C++ 符号。
当然,特定二进制文件携带对某些库函数的外部引用这一事实并不能保证该二进制文件在运行时实际上会调用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)