GCC's ld尽力找到正确的库来链接。据我所知,它考虑-mcpu, -mthumb, -mfpu, and -mfloat-abi(参见下面的示例)。此列表可能不完整,-mthumb-互通可能也会被考虑。如果-mcpu被指定后,架构就从该值派生出来。
所以这些选项应该传递给ld,你应该检查一下ld确实选择了正确的 multilib。
对于每个选项都有内置的默认值,这些默认值可能不会导致正确的方向。
If ld找不到匹配的库,它会回退到默认库。没有错误消息。
所以在你的情况下 - 假设你已经通过了-mcpu to ld并且您的工具链安装正确 - 可能没有匹配的 multilib,并且ld使用默认的。链接过程在技术上是成功的,但您没有得到您想要的。
一些示例(arm-none-eabi-gcc 4.6.2)
可用的多库:
$ arm-none-eabi-gcc -print-multi-lib
.;
thumb/arm7tdmi-s;@mthumb@mcpu=arm7tdmi-s
thumb/cortex-m0;@mthumb@mcpu=cortex-m0
thumb/cortex-m3;@mthumb@mcpu=cortex-m3
thumb/cortex-m4;@mthumb@mcpu=cortex-m4
thumb/cortex-m4/float-abi-hard/fpuv4-sp-d16;@mthumb@mcpu=cortex-m4@mfloat-abi=hard@mfpu=fpv4-sp-d16
默认
$ arm-none-eabi-gcc -print-multi-directory
.
如果未找到给定 cpu 的 multilib,它也会使用默认值 - 不会出现错误消息:
$ arm-none-eabi-gcc -print-multi-directory -mcpu=arm926ej-s
.
没有错误消息,即使-mcpu“显然”是错误的(即该 cpu 不在已知 ARM CPU 列表中,您可以使用arm-none-eabi-gcc --目标帮助):
$ arm-none-eabi-gcc -print-multi-directory -mcpu=xxx
.
即使-mcpu=皮质-m4,选择了无效的多重库。 cm4 仅支持拇指,因此该值可以从-mcpu,但内置默认值获胜:
$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4
.
要获得 cm4 的正确 multilib,-mthumb也是必要的,这对于覆盖指令集的默认值是必要的:
$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 -mthumb
thumb/cortex-m4
要获得 cm4 的正确 multilib 以及对浮点运算的硬件支持,-mfpu可能还不够:
$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 -mthumb -mfloat-abi=hard
.
这个需要
$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
thumb/cortex-m4/float-abi-hard/fpuv4-sp-d16
Further 有关 multilib 的详细信息可以在这里找到 http://www.tablix.org/~avian/blog/archives/2013/04/multilib_weirdness/ and in 奥塞伦的回答 https://stackoverflow.com/questions/12963209/why-does-arm-linux-gnueabi-g-4-4-always-build-a-7-a-binary
正如 auselen 已经评论的那样,解决此问题的最简单方法是找到正确的工具链,因为构建 ARM 工具链是另一回事。