arm-linux-gcc与arm-elf-gcc的区别

5

我正在研究使用arm-linux-xxx构建内核,但使用arm-elf-xxx构建用户应用程序的uClinux系统。

如果应用程序旨在在Linux上运行,使用arm-linux-xxx构建所有内容是否更好?

在整个uClinux构建配置中,如何设置该选项?


arm-linux-*和arm-elf-*是指向其他应用程序的符号链接吗?例如,在我的系统上,arm-linux-gcc指向arm-unknown-linux-uclibceabi-gcc。 - ctuffli
6个回答

2
编译器的名称并不一定有任何含义。根据编译器的建造者(和命名者),你会得到不同的结果。可以说,对于特定的配置,有一个正确的名称,但某个随机编译的gcc可能不正确。
对于CodeSourcery编译器(可能是最正确的名称),请参见它们的平台页面以了解它们的命名含义。

2

您可以运行arm-linux-gcc -varm-elf-gcc -v来查看这两个版本的gcc之间的一些差异(例如目标体系结构/语言)。


0
区别在于arm-elf-xxx工具链链接的输出是Linux可加载二进制文件,而arm-linux-xxx则输出内核对象(ko),它是具有自己链接格式(用于模块)的二进制大块,或者是主内核本身,不需要打包格式。也就是说,对于用户空间,您希望最终动态链接的对象是ELF可执行文件、库或共享对象。对于内核空间,您希望最终的对象(内核或模块)处于linux-arm-kernel链接格式中。
您会注意到两个目标的中间对象(.o文件)可能都是ELF,因为这是工具链所期望的。

这几乎是错误的。内核构建和用户空间构建的工具链没有区别(或者说不需要有区别)。 - Kristof Provost

0

ELF是Linux和许多其他操作系统使用的二进制格式:

ELF格式已经在许多类Unix操作系统中取代了旧的可执行文件格式,如a.out和COFF,例如Linux、Solaris、IRIX、FreeBSD、NetBSD、OpenBSD、DragonFly BSD、Syllable和HP-UX(除了继续使用SOM的32位PA-RISC程序)。ELF还在非Unix操作系统中得到了一些采用,例如基于Itanium的OpenVMS版本以及面向x86计算机的BeOS修订版4及更高版本(其中它取代了可移植可执行文件格式;PowerPC版本仍然使用首选可执行文件格式)。PlayStation Portable、PlayStation 2、PlayStation 3、Wii和GP2X控制台也使用ELF。AmigaOS 4和MorphOS也在PowerPC机器上运行,使用ELF。在Amiga平台上,ELF可执行文件已经取代了先前在配备PPC处理器扩展卡的Amiga上使用的EHF(扩展Hunk格式)。Symbian OS v9使用基于ELF文件格式的E32Image[3]格式。
大多数索尼爱立信手机(例如W800i、W610、K790等)、一些西门子手机(SGOLD和SGOLD2平台:从Siemens C65到S75和BenQ-Siemens E71/EL71)和摩托罗拉手机(例如E398、SLVR L7、v360、v3i和所有应用补丁的LTE2手机)可以通过添加汇编代码到主固件的补丁(在地下修改文化中称为ELFPack)来运行ELF文件。

0
在我们的情况下,我们使用 sparc-elf-gcc 构建 Linux,并使用 sparc-..-linux-gcc 构建运行于 Linux 上的 Busybox 应用程序。我认为这是正确的做法,而不是相反的方式。

0

我记得在某个时候,中间那一部分似乎并不重要。正如已经提到的,Elf是标准的文件格式,你无论如何都要使用它,并且无论二进制名称如何都会得到它。更重要的可能是调用约定,我不知道当调用共享库函数时,您是否必须使您的调用约定匹配,或者它是否在其他地方处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接