the 1st edition: 20191121
--gc-sections -ffunction-sections -fdata-section 這些選項是搭配用的, --gc-sections 是 ld option, -ffunction-sections -fdata-section 是 compiler 用的。
- 使用--gc-section编译选项减小程序体积
- -ffunction-sections -Wl,--gc-sections
這兩篇文章說明了這些選項的功用, 我主要以實際的例子做個補充。
k.c 有個 abc(), abc() 呼叫了 def(), 但是 def() 沒有定義, 學校教學或是書上的 c 語言書籍一定會跟你說這樣是編譯不過的, 會有 linking error。
但在現實的工程上就是會有些不同, 運用了編譯器/連結器的特異功能, 這個程式是可以正確編譯的。因為 main() 根本沒呼叫 abc(), 如果只編譯/連結 main(), xyz() 應該就可以過關, 這便是 --gc-sections, -ffunction-sections 的組合技用法。
list 2. 沒有 -Wl,--gc-sections, 有預期的 linking error, 沒有定義 def(); list 3 加入了 -Wl,--gc-sections, 成功 link。
原理就是第一篇文章說的那樣, 需要理解 section 這個東西, 才能理解文章的內容。
來看看他們的 section 有何不同。
list 5 L27 只有 .text section, 並沒有為每一個 function 產生一個 section。
list 6 L33, 37, 39 為每一個 function 產生一個 section, 這樣 linker 就可以把 .text.abc section 移除, 就可以輸出 elf 執行檔。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。