2017-08-23 62 views
1

我想對Linux/BSD上的C代碼進行一些分析,以查看正在使用的庫函數的頻率。所以基本上我想編譯代碼,並在編譯步驟之後以某種方式打印出此代碼使用的所有函數。例如:「chown,mmap等等」。我想在幾千個開源應用程序上運行這個程序,以便尋找自動化。如何在編譯時識別所有libc調用?

有沒有辦法做到這一點?

注意。像strace或ptrace這樣的動態工具對我來說是行不通的,因爲我無法運行所有的應用程序,即使我這樣做了,我也許無法通過每條代碼路徑,所以可能會錯過一些可能的調用(即調用只發生在錯誤條件)

+0

我會從看'strace'開始。 –

+0

您可能在鏈接過程中獲取此信息。檢查'ld'選項? – neuhaus

+0

謝謝。我加了一張紙條,爲什麼strace在這種情況下不起作用。 – nightshade99

回答

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也將顯示類似的數據。

+0

objdump在我的平臺上不適用於我,但nm -D似乎提供了一些信息。感謝提示! – nightshade99