2010-04-13 96 views

回答

1

因爲我問這個問題,GCC 4.5發佈,其中包括一個選項,所有的文件,所以它看起來結合就像它只是一個巨大的源文件。使用該選項,可以輕鬆去除未使用的功能。

更多詳細信息here

1

你有沒有看過使用-Os調用gcc(優化大小)。我不確定它是否剝離了未經驗證的代碼,但它足夠簡單,可以進行測試。在取回可執行文件之後,您也可以「去掉」它。我確定有一個gcc命令行arg來做同樣的事情 - 它是--dead_strip?

1

除了-Os來優化大小,this鏈接可能會有所幫助。

2

如果您正在編譯目標文件(不是可執行文件),那麼編譯器將永遠不會刪除任何非static函數,因爲總是有可能將目標文件與另一個將調用該函數的目標文件鏈接起來。所以你的第一步應該儘可能多的聲明static。其次,編譯器刪除任何未使用的函數的唯一方法是靜態鏈接您的可執行文件。在這種情況下,至少有一種可能性,程序可能會出現並找出哪些功能被使用,哪些不被使用。

問題是,我不相信gcc實際上會做這種跨模塊優化。你最好的選擇是-Os標誌來優化代碼大小,但即使如此,如果你有一個目標文件abc.o,它有一些未使用的非靜態函數,並且靜態鏈接到一些可執行文件def.exe,我不相信gcc會去掉未使用函數的代碼。

如果你真的非常需要這樣做,我想你可能不得不將#include這些文件放在一起,以便在預處理器通過後,它會生成一個正在編譯的.c文件。使用gcc編譯一個巨大的巨型源文件,您可以消除未使用函數的最佳機會。

0

IIRC鏈接器默認情況下做你想要的東西在一些特定情況下。它的缺點是庫文件包含一堆目標文件,只有被引用的文件被鏈接進來。如果你能弄清楚如何讓GCC將每個函數發送到它自己的目標文件中,然後將它建立到一個庫中,你應該得到你在看什麼。

我只知道一個編譯器,它可以真正做到這一點的:here(看-lib標誌)

相關問題