1、-mthumb 和 -mthumb-interwork
"-mthumb”的意義是:使用這個編譯選項生成的目標文件是Thumb指令的,目前還沒有發(fā)現(xiàn)GNU編譯器中有哪一個選項可以指定生成的目標文件是thumb-2的。
相對應(yīng)的,“-marm“的意義是,使用編譯選項生成的目標文件是ARM指令的。
注意,不同編譯器對該選項是否默認開啟是不一樣的,實際測試的結(jié)果如下:
arm-none-eabi-gcc (20160919)?為Cortex-m4編譯,(-mcpu=cortex-m4),不加-mthumb選項,提示“target CPU does not support ARM mode”(Cortex-M處理器只支持Thumb指令,包含16位和32位);
arm-none-eabi-gcc (20191025)?為Cortex-m4編譯,(-mcpu=cortex-m4),不加-mthumb選項,可以順利通過編譯。
"-mthumb-interwork?”編譯選項生成的目標文件就是thumb的,但是可以被其他的ARM的目標文件交叉調(diào)用。
一般如果工程中需要一部分文件目標文件編譯為ARM指令,一部分目標文件編譯為Thumb指令時, 可以在這兩部分的編譯選項中都加入"-mthumb-interwork”選項,這樣就可以在后面將這兩部分鏈接為一個可執(zhí)行文件,例如:
arm-elf-gcc -mthumb-interwork -marm -c arm.c -o arm.o
arm-elf-gcc -mthumb-interwork -mthumb -c thumb.c -o thumb.o
arm-elf-gcc -mthumb-interwork arm.o thumb.o -o a.out
2、-mfloat-abi=softfp 和 -mfloat-abi=hard
該選項指定了浮點運算的實現(xiàn)方式,用軟件計算還是硬件計算。實際使用中需要根據(jù)硬件特性(是否支持硬件浮點單元)以及鏈接的Lib庫(包括libc,libm等)類型進行選擇,如果不匹配鏈接時會出現(xiàn)"VFP register arguments"錯誤(VFP=Virtual Float Point,虛擬浮點運算)。
如果不加以指定,默認使用-mfloat-abi=softfp?軟件浮點方式。
3、-fno-builtin
-fno-builtin用于解決當用戶自定義的函數(shù)與C語言的內(nèi)建函數(shù)(C庫函數(shù))沖突的問題。當用戶自定義的函數(shù)與內(nèi)建函數(shù)沖突時,若在gcc的編譯選項中加上-fno-builtin時,則表示不使用C語言的內(nèi)建函數(shù)。
對于有些函數(shù)不想用內(nèi)建函數(shù),而其他的某些函數(shù)還是希望使用內(nèi)建函數(shù)時的場景,那么可以使用?-fno-builtin-function?選項,其中的function就是沖突的函數(shù)名,例如-fno-builtin-printf。
4、-fdata-sections 和 -ffunction-sections
-fdata-sections用于將每個符號創(chuàng)建為一個sections,其中每個sections名與data名保持一致
-ffunction-sections用于將每個函數(shù)創(chuàng)建為一個sections,其中每個sections名與function名保持一致。
用于代碼的分割和裁剪,會將每一個函數(shù)都拆分成.text、.rodata、.data、.bss段,這部分和對象文件的鏈接有關(guān)。加上這兩個參數(shù),配合鏈接器可以去除代碼中無用的部分,減少代碼大小。如果沒有這兩個參數(shù),編譯器就會按文件分段而不是按照函數(shù)分段。
5、-fno-common
-fno-common用于未初始化的全局變量當成強符號,重復(fù)定義就會報錯
6、-Xlinker -print-memory-usage
-Xlinker -print-memory-usage用于打印各段實際使用情況
LDFLAGS += -Xlinker -print-memory-usage
效果:
Memory region Used Size Region Size %age Used
ATCM_I: 0 GB 16 KB 0.00%
ATCM_D: 184 B 32 KB 0.56%
DTCM_I: 0 GB 48 KB 0.00%
RAM_QSPI: 0 GB 16 MB 0.00%
RAM_DEV: 0 GB 1 MB 0.00%
RAM_DEV1: 0 GB 1152 KB 0.00%
RAM_DEV2: 0 GB 1 MB 0.00%
RAM_ARM0: 576 B 48 KB 1.17%
RAM_SHARE: 0 GB 48 KB 0.00%
RAM_ARM1: 102844 B 160 KB 62.77%
ROX_ARM1: 23587 B 352 KB 6.54%
XIP_ARM: 313852 B 1536 KB 19.95%
參考資料:
GCC部分編譯選項解析 - DF11G - 博客園 (cnblogs.com)
arm-none-eabi-gcc編譯選項(ChibiOS)_uav360的博客-CSDN博客_arm-none-eabi-gcc文章來源:http://www.zghlxwxcb.cn/news/detail-667227.html
利用gcc-arm-none-eabi開源工具鏈開發(fā)STM32程序 (copyfuture.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-667227.html
到了這里,關(guān)于arm-none-eabi-gcc編譯、鏈接選項詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!