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

2023-10-27

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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

arm-none-eabi-gcc编译、链接选项详解 的相关文章

随机推荐

  • java输入对话框_Java语言程序设计(五)从对话框获取输入及String类型

    1 String类型 char类型只能表示一个字符 为了表示一串字符 使用成为String 字符串 的数据类型 例如下述代码将消息声明为一个字符串 String message Welcome to Java String实际上与Syste
  • 敏捷开发“松结对编程”实践之五:代码检查篇(大型研发团队,学习型团队,139团队,师徒制度,代码审查)

    转载自 http blog csdn net cheny com article details 6594507 本文是 松结对编程 系列的第五篇 之一 之二 之三 之四 之五 之六 之七 之八 此系列之九及之后文章请见栏目总目录 松结对和
  • 基础 - JSON

    JSON JavaScript Object Notation 时下最流行的数据交换格式 特点 键和值 都必须包裹在引号中 语法 数据在键值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 格式 var JSON name WeWeZh
  • Java Future接口、Future模式理解

    Future接口介绍 在Java中 如果需要设定代码执行的最长时间 即超时 可以用Java线程池ExecutorService类配合Future接口来实现 Future接口是Java标准API的一部分 在java util concurre
  • google-java-app-engine

    http code google com appengine docs java tools uploadinganapp html Uploading the App java app 的说明 PS google已经统治了地球了
  • 如何解决二分类中的样本不平衡问题

    在搭建模型时 二分类中 经常会遇到目标变量的分类数量相差很大 比如分类是1的数量是5000 分类是0的数量是100 这样如果对数据的不平衡性不做处理 模型的效果也会很差 今天用一个案例来进行实操 1 案例目的 找出有资金需求的中小企业借贷户
  • 中手游上半年扭亏为盈,仙剑IP魅力不减?

    你也曾有过江湖梦吗 你也曾因 为国为民 为友为邻 的侠者心无处可安而苦恼吗 那么 仙剑 系列游戏或许可以成为你的灵魂寄托之所 而能让侠者的江湖梦具象化的幕后厂商 便是中手游 两年前 中手游斥巨资买下了仙剑IP的大陆地区权益 两年内 中手游不
  • Zookeeper集群启、停、状态查看脚本

    zk sh bin bash if lt 1 then echo Please type parameter like
  • 工业物联网与其他物联网应用有哪些不同?

    物联网在众多的细分领域里早已让相关的企业实现了颠覆性的转型 这些领域涵盖了消费物联网 智慧农业领域 医疗保健 制造业领域和公用事业领域等等 工业物联网作为物联网一个不容忽视的子集 它专注于解决工业应用中的特殊要求 如制造业 石油和天然气及公
  • [MySql]基本知识及表的创建

    目录 1 数据库的操作 2 常用的数据类型 2 1数值类型 2 2字符串类型 2 3日期类型 3 表的操作 4 使用示例 1 数据库的操作 show databases 显示当前数据库 create database database na
  • linux服务器安装mysql步骤详解

    还是按照菜鸟教程上的顺序进行安装 踩的坑还是比较少的 MySQL 安装 菜鸟教程 1 安装前 我们可以检测系统是否自带安装 MySQL rpm qa grep mysql 2 如果你系统有安装 那可以选择进行卸载 rpm e mysql 普
  • ModBus协议部分功能码设计与实现方法(QT环境)

    写在前面 资源 QT环境下实现资源 1 调研 1 1 什么是Modbus Modbus由MODICON公司于1979年开发 是一种工业现场总线协议标准 1996年施耐德公司推出基于以太网TCP IP的Modbus协议 ModbusTCP M
  • (9)目标检测_SSD的原理

    0主要参考原理来源 1 SSD 论文 代码 pytorch zonechen 博客园 2 python ssd目标检测 目标检测之SSD算法实现 Pytorch weixin 39805734的博客 CSDN博客 3 2 1SSD算法理论
  • Python教程:Python3.8了解差不多了,Python3.9新特性了解一下

    本期Python教程将解释 Python 3 9 中的新特性 而不是 3 8 官网目前也只有 3 8 的下载包 3 9 需要自己编译 Cpython 语言上的变化 1 使用 Python 进行相对导包的时候 import 出现异常时类型由原
  • 启动失败 Failed to determine a suitable driver class 问题解决方案

    1 问题描述 启动报错 Description Failed to configure a DataSource url attribute is not specified and no embedded datasource could
  • GFS故障解决

    一 问题描述 之前 两台数据库服务器安装了两个实例 共享磁盘阵列 通过ASM管理 日志文件和控制文件等 通过GFS实现共享存储文件同步 系统工作正常 某天加入第三个节点时失败 集群正常使用就没再管它 某日 数据库异常 重启操作系统后 GFS
  • Spring Boot整合Mybatis-Plus快速入门(二)

    之前快速搭建项目中 创建的类名与表名以及属性名都是一致的 所以mybatis plus可以根据类名以及属性名进行对应的操作 那么如果表名与属性名中不一致或属性名与列名不一致时我们应该怎么处理呢 这里mybatis plus为我们提供了很多注
  • 解决VMware14打开虚拟机黑屏问题

    最近把VMware升级到14 0之后 运行虚拟机之后无法显示图像 屏幕一团黑 但点击显示缩略图的时候是可以看到系统已经启动并在正常运行的 可以通过以下方法解决 以管理员身份打开命令提示符 输入命令 netsh winsock reset 重
  • 知识图谱(七)——事件抽取

    文章目录 一 任务概述 1 事件的定义 2 事件抽取的定义 3 相关评测和语料资源 二 限定域事件抽取 1 基于模式匹配的事件抽取方法 1 有监督的事件模式匹配 2 弱监督的事件模式匹配 3 优缺点 2 基于机器学习的事件抽取方法 1 有监
  • arm-none-eabi-gcc编译、链接选项详解

    1 mthumb 和 mthumb interwork mthumb 的意义是 使用这个编译选项生成的目标文件是Thumb指令的 目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb 2的 相对应的 marm 的意义是