2010-12-15 36 views
4

我想從大型項目中刪除死碼,並希望以未使用的符號開頭。無論如何要讓鏈接器列出它已經優化過的未使用的符號嗎?我正在使用GNU鏈接器(LD)和GCC。清單未使用的符號

失敗的是,任何Binutils(readelf或objdump)都可以執行相同的功能嗎?

+0

[在大型C++遺留應用程序中查找「死代碼」]的可能重複(http://stackoverflow.com/questions/2380153/finding-dead-code-in-a-large-c-legacy-application) – icecrime 2010-12-15 10:46:20

+0

這個問題是特定於Binutils – doron 2010-12-15 11:00:33

+1

可能的重複[有沒有辦法讓gcc警告關於未使用的函數?](http://stackoverflow.com/questions/9091397/is-there-a-way-to- get-gcc-to-warn-about-unused-functions) – 2012-03-02 02:56:40

回答

6

大多數編譯器/鏈接器優化未使用的符號。如果您正在* nix系統上運行,則可以嘗試在所有目標文件上使用命令「nm」,對其進行過濾並對其進行分類,以生成由這些目標文件定義的所有導出函數的列表。

nm *.o | grep "^[0-9a-f]* T " | sed 's/^[0-9a-f]* T //' | sort -u > symbols_in.txt 

我相信你可以在最後的二進制文件上做同樣的事情。

如果您然後比較兩組結果,您應該得到所有未使用的導出函數的列表。

請注意,某些函數可能被作爲條件編譯結果而被排除的代碼使用。例如。一個#ifdef開關說,在平臺A上,使用這樣和那樣的內置功能,並在另一個平臺上使用你自己的函數版本,因爲沒有內置的或標準的庫等價物,或者它不能正常工作。

+0

我首先嚐試了類似這種方法,但遇到了麻煩,因爲在模塊中聲明的符號以及從該模塊調用的* only *(未聲明爲「static」)看起來像是未使用的。另外,默認情況下,gcc不會進行函數級別的鏈接,因此模塊中未使用的函數與使用函數一起不會被消除。這個問題有一個更好的解決方案:[有沒有辦法讓gcc警告未使用的函數?](http://stackoverflow.com/questions/9091397/is-there-a-way-to-get-gcc-到警告-約未使用的函數) – 2012-03-02 02:56:27

4

GCC可以在遇到未使用的函數,標籤和函數參數時生成編譯器警告。編譯器標誌-Wunused -Wunused-parameter將執行此操作。

我個人建議在開發時打開所有警告和額外警告。這些標誌是-Wall -Wextra,這些標誌暗示了死代碼警告,以及其他一些我發現有用的警告。

+5

這隻對不可重定位符號有幫助。如果符號是可重定位的,我們必須等待鏈接器決定是否需要該符號,這樣編譯器將無法在這裏提供幫助。 – doron 2010-12-15 11:39:32