我正在查看使用 arm-linux-xxx 构建内核的 uClinux 系统,但使用 arm-elf-xxx 构建用户应用程序。
如果这些应用程序旨在在 linux 上运行,那么使用 arm-linux-xxx 构建所有内容不是更好吗?
在整个 uClinux 构建配置中在哪里设置该选项?
我正在查看使用 arm-linux-xxx 构建内核的 uClinux 系统,但使用 arm-elf-xxx 构建用户应用程序。
如果这些应用程序旨在在 linux 上运行,那么使用 arm-linux-xxx 构建所有内容不是更好吗?
在整个 uClinux 构建配置中在哪里设置该选项?
编译器的名称并不一定意味着什么。根据谁构建了编译器(并命名它们),你会得到不同的结果。可以说,特定配置有一个正确的名称,但一些随机编译的 gcc 可能不正确。
对于 CodeSourcery 编译器(可能是最正确的名称),请参阅他们的平台页面以了解其命名的含义。
您可以运行arm-linux-gcc -v
并arm-elf-gcc -v
查看这两个 gcc 版本之间的一些差异(例如目标体系结构/语言)。
我似乎记得在某个时候,中间的那一点无关紧要。正如已经提到的 elf 是标准文件格式,无论如何你都想使用它,并且无论如何都会得到它独立于二进制名称。可能(或不)更重要的是调用约定,我不知道在调用共享库函数时是否必须使调用约定匹配,或者是否在其他地方为您处理。
ELF 是linux的二进制格式,许多其他人使用:
ELF 格式在许多类 Unix 操作系统(如 Linux、Solaris、IRIX、FreeBSD、NetBSD、OpenBSD、DragonFly BSD、Syllable 和 HP-UX 除外)中取代了旧的可执行格式,如 a.out 和 COFF(32-位 PA-RISC 程序继续使用 SOM)。ELF 也被一些非 Unix 操作系统采用,例如 OpenVMS 的 Itanium 版本,以及基于 x86 的计算机的 BeOS Revision 4 及更高版本(它取代了 Portable Executable 格式;PowerPC 版本保留了 Preferred Executable Format)。PlayStation Portable、PlayStation 2、PlayStation 3、Wii 和 GP2X 游戏机也使用 ELF。AmigaOS 4 和 MorphOS 也在 PowerPC 机器上运行,使用 ELF。在 Amiga 平台上,ELF 可执行文件取代了以前在配备 PPC 处理器扩展卡的 Amigas 上使用的 EHF(扩展块格式)。Symbian OS v9 使用基于 ELF 文件格式的 E32Image[3] 格式。
大多数索尼爱立信(例如,W800i、W610、K790 等),一些西门子(SGOLD 和 SGOLD2 平台:从西门子 C65 到 S75 和明基西门子 E71/EL71)和摩托罗拉(例如,E398、SLVR L7 、v360、v3i 和所有手机 LTE2 都应用了补丁)手机可以通过使用将汇编代码添加到主固件(在地下改装文化中称为 ELFPack)的补丁来运行 ELF 文件。
不同之处在于 arm-elf-xxx 工具链的链接输出是一个 linux 可加载二进制文件,而 arm-linux-xxx 输出一个内核对象 (ko),它是一个具有自己链接格式的 blob(用于模块),或者主内核本身,不需要打包格式。即,对于用户空间,您希望最终的动态链接对象是 ELF 可执行文件、库或共享对象。对于内核空间,您希望最终对象(内核或模块)采用 linux-arm-kernel 链接格式。
您会注意到两个目标的中间对象(.o 文件)可能都是 ELF,因为这是工具链所期望的。
在我们的例子中,我们使用 sparc-elf-gcc 构建 linux,我们使用 sparc-..-linux-gcc 构建busybox(在 linux 上运行的应用程序)。我认为这是正确的,而不是相反。