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

这篇具有很好参考价值的文章主要介绍了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)文章来源地址https://www.toymoban.com/news/detail-667227.html

到了这里,关于arm-none-eabi-gcc编译、链接选项详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板

    Arm-none-eabi-gcc + Makefile+OpenOCD+CMSIS-DAP+Vscode工程模板 一、本次环境搭建所用的软硬件 1)Windows or Linux (本文以Windows为主) 2)JLink、Daplink、Wch-Link烧录器 3)GNU Arm Embedded Toolchain交叉编译器 4)Mingw-w64 GCC for Windows 64 5)Debug 调试工具 openocd 6)Visual Studio Code 二、软件安装配置 GNU Arm

    2024年02月03日
    浏览(47)
  • ARM交叉编译工具链 gcc-arm-none-eabi

    1,交叉编译工具链简介 (1)命令规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch – 体系架构ÿ

    2024年03月25日
    浏览(56)
  • arm gcc编译选项

    arm:架构是arm none:不是特定的供应商提供的 eabi:eabi:嵌入式应用二进制接口(Embedded Application Binary Interface) 因为名称里没有“linux”类似的字样,说明不支持操作系统。 libc 是ANSI C 语言函数库,包含了 C 语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其

    2024年02月03日
    浏览(38)
  • 【ARM 嵌入式 编译系列 2.5 -- GCC 编译参数学习 --specs=nano.specs选项 】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 ARM 工具链 ( arm-none-eabi- ) 包括了一个叫作 --specs 的编译器和链接器选项,这个选项允许用户指定一个或多个 “specs” 文件,以影响编译或链接阶段的行为。Specs 文件包含一系列的命令行参数,这些参数可以是编译器选项

    2024年01月22日
    浏览(47)
  • arm-none-eabi-size 查看内存映像大小

    一、概述 1.1 功能 1.2 命令格式 1.3 支持的目标文件 二、基本应用示例 2.1 查看单个对象文件 2.2 查看整个工程的内存映像 三、命令选项描述 3.1 以不同的进制格式显示内存映像 示例:以十六进制格式显示 3.2 不同的输出方式 3.2.1 可选的表示方式与对应的选项 3.2.2 -A (–format=

    2024年02月09日
    浏览(52)
  • 【ARM 嵌入式 编译系列 3.5 -- gcc 链接参数介绍】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 上篇文章【ARM 嵌入式 编译系列 3.4 – 查看所依赖库文件的路径 详细介绍】一直在提 链接参数 ,那么链接参数有哪些,它们又有什么作用呢? 如前一篇文章中的的链接参数到底是什么意思呢? -L : 指定了 链接库的路径

    2024年01月17日
    浏览(44)
  • 【ARM 嵌入式 编译系列 7.3 -- GCC 链接脚本中 DISCARD 与 .ARM.exidx】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 在移植 RT-Thread 到 cortex-m33(RA4M2)上的时候,在编译的时候遇到下面问题:

    2024年01月23日
    浏览(46)
  • 【ARM 嵌入式 编译系列 4.2 -- GCC 链接规范 extern “C“ 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.1 – GCC 编译属性 likely与unlikely 学习 下篇文章:ARM 嵌入式 编译系列 5 – GCC 内建函数 __builtin 介绍 extern “C” 是一种链接规范,它用于告诉C++编译器按照C语言的方式来链接代码。这个主要用于在C++代码

    2024年02月13日
    浏览(53)
  • vscode 无法使用 compilerPath“D:.../bin/arm-none-eabi-g++.exe”解析配置。

            最近在使用vscode搭建ODrive STM32开发环境,依次安装了以下内容:                 1.Python3: 用于运行工程构建脚本                 2.ST-Link/V2 Drivers: STLink/v2编程器的驱动                 3.Visual Studio Code: 轻量级但功能强大的源代码编辑器      

    2024年02月08日
    浏览(43)
  • 【ARM 嵌入式 编译系列 7.3 -- GCC 链接脚本中 NOLOAD 和 GROUP 的详细介绍】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 在使用 arm-none-eabi-gcc 工具链中的链接器脚本时,链接脚本使用链接器命令语言来描述如何生成最终的可执行文件。其中, noload 和 group 是两个用于控制链接过程的。 NOLOAD NOLOAD 用于指示链接器在输

    2024年01月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包