使用 gc section編譯選項減小程式體積

2022-03-15 09:18:52 字數 876 閱讀 6001

本週在給程式新增功能的時候,突然發現,我只是寫了幾個函式,還沒呼叫,size就變大了。這肯定是不行的嘛,沒用的函式就應該不鏈結進來,占用我寶貴的空間。

這種功能,講道理編譯器肯定要支援的,於是搜了一下,果然是有個編譯選項

需要在編譯的時候,加入-ffunction-sections, -fdata-sections 選項,在鏈結的時候,加入--gc-sections選項

大概的意思就是,編譯的時候,把每個函式作為乙個section,每個資料(應該是指全域性變數之類的吧)也作為乙個section,這樣鏈結的時候,--gc-sections會把沒用到的section丟棄掉,最終的可執行檔案就只包含用到了的函式和資料。

也就是說,鏈結的單位,是函式級別,這樣就能丟棄沒使用的函式。如果不加-ffunction-sections選項,則預設似乎是每個原始檔為乙個section進行鏈結,這樣子只要這個檔案中用到了乙個函式,那麼所有的函式都會被鏈結進來。

找了個小程式試了下,效果顯著,於是加到了工作**的makefile中,但是,問題出現了,居然給我鏈結出來乙個接近空的檔案

一臉懵逼

想來想去,突然想到,是不是鏈結指令碼有問題,沒指定入口函式,所以編譯器認為所有的函式都沒用,於是全部丟棄了

趕緊試試,果然, 在lds檔案中加上  entry(_start) 之後,就好了,編譯出來檢視map檔案,確實把沒用到的函式丟棄了

但還有乙個問題,就是不能加上 -fdata-sections ,加上就報錯,只能用-ffunction-sections,這個暫時沒解決

想起以前用stm32的時候,keil(mdk)就提供了乙個選項,options->c/c++  中勾選上 「one elf section per function」核取方塊,能減小程式的size,當時也是由於記憶體不夠了,才查到的這個選項。

VC編譯選項

vc編譯選項 od 禁用優化 預設值 disable optimizations default ox 最大化選項。ogityb2 gs maximum opts.ogityb1 gs og 啟用全域性優化 enable global optimization oy 啟用框架指標省略 enable ...

PHP編譯選項

編譯擴充套件庫 usr local php bin phpize configure with php config usr local php bin php config make make install ln s ext sockets modules sockets.so sockets....

GCC編譯選項

gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器ld 引數詳解 c 只啟用預處理,編譯,和彙編,也...