我设法为arm926ej-s制作了一个目标文件 我在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编译时,它会为armv7创建可执行文件而不是这个
那么如何编译正确的cpu ??
我试过$ arm-linux-gnueabi-gcc-4.4 -static -mcpu = arm926ej-s hello.c -o hello
它创造了
Tag_CPU_name:“7-A”
Tag_CPU_arch:v7
答案 0 :(得分:3)
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仅支持thumb,因此该值可以从 -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
要获得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
进一步details regarding multilib can be found here和auselen's answer
正如auselen已经评论过的,最简单的解决方法是找到合适的工具链,因为构建ARM工具链是另一回事。