最近我尝试为arm平台制作自己的交叉编译工具链。我注意到使用 GCC 的 autoconf 脚本,我必须传递如下变量:
--with-cpu=cortex-m4 \
--with-fpu=fpv4-sp-d16 \
--with-float=hard \
--with-mode=thumb \
所以看来不同的 ARM 平台应该有不同的工具链/编译器,因为我必须配置 cpu、fpu 等。但后来我发现这些工具链有某种预制的二进制文件。
https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
我尝试了这个工具链并编译了一个 hello world 程序并在我的目标 ARM 板上尝试了它,然后它显示“分段错误”。好吧,至少不是“无法执行二进制文件:Exec 格式错误”
但我还是想知道,它怎么不起作用?或者它实际上应该起作用吗?
答案1
在构建工具链本身时,您必须配置要支持的功能。您可以构建一个“精简”编译器,仅支持您想要的目标所需的功能。
但您也可以支持 ARM 平台提供的所有功能并获得一个笨拙的编译器。
对于功能本身,不同类型之间应该有所不同:
- 像这样的优化标志
-mcpu
不是必需的,它们只是为了优化特定 ARM 处理器的代码 fpu
另一方面,ARM 内核的功能必须可用于使用 FPU 。- 您
float=hard
取决于操作系统,而不是处理器:它允许将浮点传递给浮点寄存器中的函数,这可以大大加快速度,因为 ARM 寄存器和浮点寄存器之间的传输速度很慢。但对于链接,系统需要对此达成一致。 - 对拇指的支持在某种程度上也是可选的。如果核心支持的话,你可以使用其中任何一个,但现在不让编译器选择拇指模式是愚蠢的。