gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:10:47 25 4
gpt4 key购买 nike

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

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

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

最佳答案

objdump命令从二进制文件中转储外部符号引用。典型的用例涉及使用 -T 选项运行它,以转储二进制文件的外部符号引用。

例如,在 /bin/ls 上运行 objdump -T:

/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 感兴趣,表示动态函数调用。在这里,我们看到一些熟悉的 C 库函数,如 getenv()sigprocmask(),被 `/bin/ls 引用。

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

在 C++ 代码中使用它时,您还需要指定 -C 选项,以分解 C++ 符号。

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

关于c++ - 如何知道程序调用了库的哪些函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54847557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com