Ubuntu 对armv5进行交叉编译,但它会创建v7二进制文件

Ubuntu 对armv5进行交叉编译,但它会创建v7二进制文件,ubuntu,arm,cross-compiling,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: "ARM926

我设法为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 它创建了
标签名称:“7-A”
Tag_CPU_arch:v7

GCC的ld尽最大努力找到正确的库来链接。据我所知,它考虑-mcpu、-mthumb、-mfpu和-mfloat abi(参见下面的示例)。此列表可能不完整,-mthumb互通可能也被考虑在内。如果指定了-mcpu,则体系结构将从该值派生

所以这些选项应该传递给ld,您应该检查ld是否真的选择了正确的多库

对于这些选项中的每一个,都有内置的默认值,这些值可能不会指向正确的方向

如果ld找不到匹配的库,它将返回默认库。没有错误消息

因此,在您的情况下-假设您已将-mcpu传递给ld,并且您的工具链安装是正确的-可能没有匹配的multilib,ld使用默认的multilib。链接过程在技术上是成功的,但是你没有得到你想要的


一些示例(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查看该列表):

即使使用-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获得正确的多库,并支持浮点运算,-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
深入



正如auselen已经评论的那样,解决这一问题的最简单方法是找到正确的工具链,因为构建ARM工具链是另一回事。

库在编译中是如何链接的?您需要找到正确的工具链,这是最简单的。这实际上是,回复为@auselen。可能重复的内容不正确。每个mcpu标志都非常明确地描述了该cpu支持的体系结构版本。这就是为什么在使用-c编译时,对象最终是针对正确的体系结构版本的。汇编程序也是如此。任何工具链默认值都无法更改这一点。我不知道GNU LD可以通过指定-march-来配置为自动支持C库的多个版本,你能提供一些如何实现这一点的参考吗?@unixsmurf:你说得对。对不起,伙计们,我有罪。我要更新我的答案,给我一些时间整理一下。@unixsmurf:我已经重写了我的答案。至于您关于-march的问题:在gcc/ld搜索multilib时,-march似乎被忽略了
$ 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