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

how to identify all libc calls at compile time?

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

有办法吗?

注意。像 strace 或 ptrace 这样的动态检测对我不起作用,因为我不能 运行 所有应用程序,即使我这样做了,我也可能不会遍历每一个代码路径,所以可能会错过一些可能的调用(即调用仅在错误情况下发生)

在已编译的二进制文件上尝试 运行 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会显示类似的数据。