本周在給程序添加功能的時候,突然發現,我只是寫了幾個函數,還沒調用,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,當時也是由於內存不夠了,才查到的這個選項。
本文地址:http://www.cnblogs.com/zqb-all/p/6128673.html