GCC強制靜態庫鏈接未使用的函數、變量


使用cmake構建嵌入式程序工程時遇到的問題,在此記錄以下。

工程框架想把芯片相關的功能抽象出一個hal層,向上屏蔽芯片的API。
每個芯片相關文件會輸出一個hal庫。
APP相關代碼編譯后與hal庫鏈接,生成最終的elf可執行文件。

不同於一般在.S匯編文件中編寫中斷向量表及中斷處理函數,
我采用的實現為,中斷向量表是一個在c文件中定義的數組__isr_vectors,通過gcc的__attribute__(section)以及配置自定義的鏈接腳本實現代碼定位。

由於__isr_vectors以及中斷處理函數鏈接到靜態庫libhal.a后,在app代碼中未被調用,因此最終生成的可執行文件中,這些符號被自動優化掉了。

  1. 解決方法
    增加鏈接選項-Wl,--whole-archive
    在需要保留所有符號的庫前增加-Wl,--whole-archive,然后增加-Wl,--no-whole-archive還原
    如:
    修改前:

:arm-none-eabi-gcc main.c -L. -lhal --specs=nosys.specs -T mem.ld -T sections.ld
:arm-non-eabi-nm a.out

結果顯示沒有__isr_vectors符號
修改后:

arm-none-eabi-gcc main.c -L. -Wl,--whole-archive -lhal -Wl,--no-whole-archive --specs=nosys.specs -T mem.ld -T sections.ld
arm-non-eabi-nm a.out

可以看到__isr_vectors已經存在

  1. 在cmake中添加鏈接選項

TARGET_LINK_LIBRARIES(app
-Wl,--whole-archive
hal
-Wl,--no-whole-archive
)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM