arm-none-eabi-gcc编译、链接选项详解

1、-mthumb-mthumb-interwork

"-mthumb”的意义是:使用这个编译选项生成的目标文件是Thumb指令的,目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb-2的。

相对应的,“-marm“的意义是,使用编译选项生成的目标文件是ARM指令的。

注意,不同编译器对该选项是否默认开启是不一样的,实际测试的结果如下:

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的目标文件交叉调用。

一般如果工程中需要一部分文件目标文件编译为ARM指令,一部分目标文件编译为Thumb指令时, 可以在这两部分的编译选项中都加入"-mthumb-interwork”选项,这样就可以在后面将这两部分链接为一个可执行文件,例如:

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

该选项指定了浮点运算的实现方式,用软件计算还是硬件计算。实际使用中需要根据硬件特性(是否支持硬件浮点单元)以及链接的Lib库(包括libc,libm等)类型进行选择,如果不匹配链接时会出现"VFP register arguments"错误(VFP=Virtual Float Point,虚拟浮点运算)。

如果不加以指定,默认使用-mfloat-abi=softfp 软件浮点方式。

3、-fno-builtin

-fno-builtin用于解决当用户自定义的函数与C语言的内建函数(C库函数)冲突的问题。当用户自定义的函数与内建函数冲突时,若在gcc的编译选项中加上-fno-builtin时,则表示不使用C语言的内建函数

对于有些函数不想用内建函数,而其他的某些函数还是希望使用内建函数时的场景,那么可以使用 -fno-builtin-function 选项,其中的function就是冲突的函数名,例如-fno-builtin-printf。

4、-fdata-sections-ffunction-sections

-fdata-sections用于将每个符号创建为一个sections,其中每个sections名与data名保持一致

-ffunction-sections用于将每个函数创建为一个sections,其中每个sections名与function名保持一致。

用于代码的分割和裁剪,会将每一个函数都拆分成.text、.rodata、.data、.bss段,这部分和对象文件的链接有关。加上这两个参数,配合链接器可以去除代码中无用的部分,减少代码大小。如果没有这两个参数,编译器就会按文件分段而不是按照函数分段。

5、-fno-common

-fno-common用于未初始化的全局变量当成强符号,重复定义就会报错

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

利用gcc-arm-none-eabi开源工具链开发STM32程序 (copyfuture.com)

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值