我设法为arm926ej-s创build一个目标文件
我在qemu上使用debian arm
arm-linux-gnueabi-gcc-4.4 -static -O -c -mcpu=arm926ej-s hello.c -o hello root@at0012-ubuntu:/qemu-deb-squeeze/mnt/package# readelf -A hello Attribute Section: aeabi File Attributes Tag_CPU_name: "ARM926EJ-S" Tag_CPU_arch: v5TEJ Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-1 Tag_FP_arch: VFPv3-D16 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte Tag_ABI_align_preserved: 8-byte, except leaf SP Tag_ABI_enum_size: int Tag_ABI_HardFP_use: SP and DP Tag_ABI_optimization_goals: Prefer Speed Tag_DIV_use: Not allowed
但是在ubuntu中,当我使用-c编译时,它创build了armv7的可执行文件,而不是这个
那么如何编译正确的cpu?
我试过$ arm-linux-gnueabi-gcc-4.4 -static -mcpu = arm926ej -s hello.c -o你好它创build
Tag_CPU_name:“7-A”
Tag_CPU_arch:v7
GCC的ld尽其所能找到正确的链接库。 据我所知,它认为-mcpu , -mthumb , -mfpu和-mfloat-abi (参见下面的例子)。 这个列表可能不完整, -mthumb-interwork也可能被考虑到。 如果指定了-mcpu ,则体系结构将从该值派生。
所以这些选项应该传递给ld ,你应该检查ld真的选择正确的multilib。
对于这些选项中的每一个,都有内置的默认值,这可能不会导致正确的方向。
如果ld找不到匹配的库,则会回到默认的库。 没有错误信息。
所以在你的情况下 – 假设你已经通过了-mcpu到ld ,你的工具链安装是正确的 – 可能没有匹配的multilib,而ld使用默认的。 链接过程在技术上成功,但你没有得到你想要的。
一些例子(arm-none-eabi-gcc 4.6.2)
可用multilibs:
$ 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 -target-help查看):
$ arm-none-eabi-gcc -print-multi-directory -mcpu=xxx .
即使使用-mcpu = cortex-m4 ,也会选择无效的multilib。 cm4只支持拇指,所以这个值可以从-mcpu派生,但是内置的默认值是:
$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 .
要得到cm4的正确的multlib, -mthumb也是必须的,这是覆盖指令集的默认值所必需的:
$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 -mthumb thumb/cortex-m4
为了获得正确的multilib for cm4和硬件支持浮点运算, -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
关于multilib的更多细节可以在这里和auselen的答案中找到
正如auselen已经评论的那样,解决这个问题的最简单方法就是找到合适的工具链,因为构建ARM工具链是另一回事。