交叉编译armv5,但它创建了v7二进制文件

时间:2013-05-22 05:33:41

标签: ubuntu arm cross-compiling

我设法为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

1 个答案:

答案 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 hereauselen's answer


正如auselen已经评论过的,最简单的解决方法是找到合适的工具链,因为构建ARM工具链是另一回事。