2015-10-26 29 views
0

lddocumentation說後,猛烈減小尺寸使用--whole - 歸檔ld的選項

--whole - 歸檔

對於 後在命令行上提及的每個歸檔--whole-歸檔選項,請在鏈接中的歸檔中包含每個對象文件,而不是在歸檔中搜索所需的對象 文件。這通常用於打開的存檔文件到一個共享庫 ,迫使每個要被包括在所產生的共享 庫對象。該選項可能會多次使用。

我已經寫了一個玩具程序,並將其與GNU gmp庫(libgmp.a)靜態鏈接。令人驚訝的是libgmp.a大小1.2 MB而生成的可執行的是526 KB。使用ar -x提取.a存檔將生成457目標文件。根據文件記載,如果所有這些鏈接都與鏈接無關,那麼鏈接後大小如何減少?有沒有什麼辦法可以確認所有的目標文件是否已經鏈接到可執行文件中?

回答

0

我很好奇,所以我沒有嘗試過自己。

我將一個空的main()放入一個源文件中,編譯並鏈接到libm.a--whole-archive指定。然後我從libm.a中提取所有的目標文件,並將它們全部鏈接起來。

我在兩個可執行文件上都使用了nm,將符號名稱切出,並輸出diff。它是相同的,兩個可執行文件都有2003符號。

我也是從libm.a自身提取的符號的名字和他們相比,那些在我的可執行文件。再次,沒有區別(當然,除了可執行文件中的C運行時符號)。

因此,我認爲--whole-archive的工作原理與廣告完全相同是很安全的。

至於大小的巨大差異,很可能是由於目標文件是成熟的ELF二進制文件引起的。他們塞滿了信息(比如ELF頭文件),這些信息並沒有進入結果可執行文件。

+0

沒錯,這是唯一可行的解​​釋我能想到的。 –