-specs 参数在 arm-none-eabi-gcc 中有什么作用?

问题描述

我在使用嵌入式 arm gcc 编译器的链接器时遇到了问题,我在网上某处找到了一个教程,说我可以通过包含参数 arm-none-eabi-gcc 来修复 -specs=nosys.specs 中的链接错误,该参数有效对我来说,它能够编译我的代码

我的芯片是 ATSAM7SE256 微控制器,据我所知,它是使用 arm7tdmiarmv4t 指令集的 thumb 处理器,我一直在使用以下代码编译代码:>

arm-none-eabi-gcc -march=armv4t -mtune=arm7tdmi -specs=nosys.specs -o <exe_name>.elf <input_files>

代码编译没有问题,但我不知道它是否在做我认为它在做的事情。

规范文件的意义是什么?您还可以使用 -specs= 设置哪些其他值,以及您希望在什么情况下使用? nosys.specs 是我想要的完全嵌入式 arm 微控制器的价值吗?

解决方法

记录在:https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gcc/Overall-Options.html#Overall-Options

它是一个文件,其中包含用于覆盖各种构建组件(例如编译器、汇编器和链接器)的标准默认值的开关。例如它可以用来替换默认的 C 库。

我从未见过它被使用过;通常裸机嵌入式系统构建显式指定 --nostdlib 然后显式链接所需的库。它可以用于特定于环境的构建环境,以链接其他默认代码,例如我猜的 RTOS。就我个人而言,我更愿意在命令行中将所有这些都明确化,将其隐藏在某个文件中。

本质上,它应用文件中指定的开关,就好像它们是默认值一样,因此可用于定义特定构建和执行环境的默认值。

规范文件的格式记录在 https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gcc/Spec-Files.html#Spec-Files

在这种情况下,如果没有看到链接器错误和 nosys.specs 文件的内容,很难说它如何或为什么解决了您的链接器问题。当然,另一种解决方案是直接应用规范文件中的任何开关。