2011-04-08 165 views
3

我正在使用apple gcc來編譯我要重新分發的dylib。出於各種原因,我使用一些庫,讓我們說libz保持簡單。避免在鏈接到靜態庫時鏈接到未使用的符號

由於這個庫通常不在Mac系統上,我希望static link in通過將路徑傳遞到.a-file來簡化部署,將符號用到dylib中。

現在,鏈接器鏈接所有符號從lib到生成的dylib,雖然我只引用一個子集。在linux上,我從來沒有遇到過這個問題,鏈接器高興地丟棄所有未引用的符號並創建一個非常纖細的可執行文件,所以它應該是可能的。我現在擁有的dylib文件比它應該大10倍。

我試着用-dead_code連接器標誌擺弄,但無濟於事。也許我只是不明白嗎?

有沒有人知道這個解決方案?

回答

5

Try -Wl,--gc-sections

至於-dead_strip(你可能是-dead_code的意思):

之前接通-dead_strip 選擇你的項目必須首先 被「移植」的死碼 剝離工作。這將包括將 從-gused(默認爲-g)更改爲 -gfull,並使用來自 Mac OS X 2004年6月發行版的新編譯器將所鏈接的所有對象文件重新編譯爲您的 程序。此外,如果 建築物加載 插件的可執行文件,它使用的符號從 可執行文件,你將不得不使用 屬性,確保 的插件使用不 剝離(符號((使用))或-exported_symbols_list選項)。如果您正在使用導出列表並構建將與ld(1)的 -bundle_loader標誌一起使用的共享庫或可執行文件 ,則需要在導出列表中包含例外 幀信息的符號 爲您導出的C++符號。這些 符號以.eh結尾,用nm(1)工具可以看到 。

and

要啓用死代碼從 命令行汽提,通過-dead_strip 選項到ld。您還應該將 -gfull選項傳遞給GCC,以便爲您的代碼生成一組完整的調試符號。鏈接器使用這個額外的 調試信息來死掉 的可執行文件。

希望這會有所幫助。

此答案中的所有內容都位於「apple ld static link unused symbols」的前幾個Google搜索結果中。 :)

+0

感謝您的谷歌這一點。在mac上進行編譯與'ELF'相對的'Mach-O'對象與' - gc-sections'開關一起使用。我試着'-gfull'開關和'-dead_strip'一起使用,但無濟於事。 – vidstige 2011-04-09 16:40:44