使用cmake構建嵌入式程序工程時遇到的問題,在此記錄以下。
工程框架想把芯片相關的功能抽象出一個hal層,向上屏蔽芯片的API。
每個芯片相關文件會輸出一個hal庫。
APP相關代碼編譯后與hal庫鏈接,生成最終的elf可執行文件。
不同於一般在.S匯編文件中編寫中斷向量表及中斷處理函數,
我采用的實現為,中斷向量表是一個在c文件中定義的數組__isr_vectors,通過gcc的__attribute__(section)以及配置自定義的鏈接腳本實現代碼定位。
由於__isr_vectors以及中斷處理函數鏈接到靜態庫libhal.a后,在app代碼中未被調用,因此最終生成的可執行文件中,這些符號被自動優化掉了。
- 解決方法
增加鏈接選項-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已經存在
- 在cmake中添加鏈接選項
TARGET_LINK_LIBRARIES(app
-Wl,--whole-archive
hal
-Wl,--no-whole-archive
)