2012-05-02 38 views
0

這裏是一些C++測試代碼:gcc:如何刪除未使用的未定義符號?

__attribute__((visibility("hidden"))) void foo() 
{ 
    int fd = fopen("data1", "rb"); 
    printf ("%d", fd); 
} 

和其他所有的代碼不調用函數「富」和功能「的fopen」

然後我用gcc選項-ffunction截面編譯代碼到一個這樣的文件。

正如我所想,函數foo符號和foo二進制代碼沒有包含在so文件中。

但問題是,我認爲符號'fopen'不應該是符號表。 ps:我可以確保只有函數'foo'使用'fopen'。 實際上,當我使用命令nm時,我發現'U'型符號'fopen'。

gcc是如何工作的? 並且有gcc其他編譯選項,發現符號'fopen'不用,並且刪除'fopen'符號。

回答

0

問題是,編譯器不知道,稍後會使用這些符號。

你可以在編譯時告訴你,你給了他整個程序,所以如果你的程序沒有調用函數,沒有人會這樣做。編號爲-fwhole-program

+0

當我添加選項-fwhole程序時,幾乎所有的符號都被刪除。 –

+0

當我添加選項-fwhole程序時,幾乎所有的符號都被刪除了。其實我只是想刪除未使用的符號,並保留使用的符號。我怎樣才能告訴編譯器?我認爲一個聰明的編譯器可以計算符號。如果symbol'count爲0,則該符號將被刪除。 –

+0

他只能刪除它們,因爲它們沒有被使用。如果他在他們仍在使用的時候將他們刪除,你的程序將無法運行。 – flolo