gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:56:21 26 4
gpt4 key购买 nike

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

最佳答案

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)

可用的多重库:

$ 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 以及对浮点运算的 HW 支持,-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 工具链是另一回事。

关于ubuntu - 为 armv5 交叉编译,但它创建 v7 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16684155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com