如何在编译时识别所有libc调用?

时间:2017-08-23 12:58:15

标签: linux libc

我想对Linux / BSD上的C代码进行一些分析,以查看正在使用的库函数的频率。所以基本上我想编译代码并在编译步骤之后以某种方式打印出该代码使用的所有函数。例如:“chown,mmap等”。我想在几千个开源应用程序上运行它,以寻找自动化。

有办法做到这一点吗?

请注意。像strace或ptrace这样的动态工具对我来说不起作用,因为我无法运行所有的应用程序,即使我这样做,我也可能无法通过每一个代码路径,因此可能会错过一些可能的调用(即只发生错误的调用)条件下)

1 个答案:

答案 0 :(得分:1)

尝试在已编译的二进制文件上运行objdump -T | grep GLIBC

例如:

$ objdump -T /bin/lessecho|grep GLIBC
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 putchar
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 puts
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.4   __stack_chk_fail
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strchr
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __libc_start_main
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strcmp
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.3.4 __printf_chk
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 exit
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 fwrite
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.3.4 __fprintf_chk
0000000000000000  w   DF *UND*  0000000000000000  GLIBC_2.2.5 __cxa_finalize
0000000000202040 g    DO .bss   0000000000000008  GLIBC_2.2.5 stderr

同样nm -D会显示类似的数据。