2012-09-18 19 views
0

可以說我有一個大型庫liblarge,以及鏈接到liblarge的應用程序應用程序。使用特定功能刪除Gcc死代碼

Liblarge根據LGPL許可證,應用程序是在一個專有的。我希望能夠從liblarge中刪除所有「死代碼」,其中未從應用程序中使用。我能以某種方式做到這一點嗎?也許給鏈接器提供一個使用過的函數列表?

+0

將liblarge編譯爲靜態庫並鏈接到* .a。根據GCC的參考,我認爲它是一個C或C++應用程序,由於ABI的工作原理,單個* .o是您可以分解成的最小單元。 –

+0

是的,這肯定會刪除死代碼,但我希望保持liblarge作爲一個動態庫,以方便遵守LGPL。 – joe

回答

0

有沒有簡單的方法讓你繼續。

您可以在私人副本上使用上述技術(在我的評論中)鍛鍊哪些* .o您可以刪除。然後,您可以構建自己修改的liblarge源代碼樹,該代碼構建DSO/DLL,但在您不需要的解決方案後,從鏈接器命令行(用於構建DSO/DLL)中除去* .o。

這就是C/C++的工作方式,一旦代碼轉換爲對象代碼,很多信息都會丟失。

例如,您可能希望嘗試減小每個* .o文件的大小。這樣做的主要方法是拆分.c/ .cpp編譯單元。

C/C++ ABIs的問題是編譯器可以自由地將代碼放在* .o文件的任何位置,然後使用相對偏移量跳入和跳出其中的段。沒有足夠的元數據保存在* .o中以便能夠拆分編譯代碼並查看它所需的所有依賴項。要做到這一點,你需要手動分割輸入源代碼。

這是嵌入式軟件開發的一個原因,當內存佔用很重要時,您會在源文件中直接放入一個函數。現在嵌入式系統有很多內存。