【问题标题】:Why does toolchain name have separate OS and EABI fields.?为什么工具链名称有单独的 OS 和 EABI 字段。?
【发布时间】:2015-10-04 06:35:50
【问题描述】:

例如。 arm-unknown-linux-gnueabi 现在,一旦操作系统(即 Linux)被修复,C 库将被修复(GLibc),因此调用约定和遵循的 ABI 将被修复。第 4 个字段(即 ABI)的要求是什么?工具链能否使用与底层操作系统和 LIBC 使用的 ABI 不同的 ABI。在那种情况下,由上述工具链编译的库将如何在操作系统上运行?

【问题讨论】:

    标签: linux gcc toolchain abi crosstool-ng


    【解决方案1】:

    这或多或少是历史原因,又名the holy wars about the sacred operating system's name。您所说的“工具链名称”实际上称为Target Triplet,顾名思义,它有三个 字段,不多也不少。在您的示例中,字段为:

    • 机器/CPU:arm
    • 供应商:unknown
    • 操作系统:linux-gnueabi

    再举一个我已经遇到过的参考例子:i686-elf-gcc,它用于hobbyist operating system development

    • 机器/CPU:i686-elf
    • 供应商:unknown(隐式)
    • 操作系统:none(隐式;编译器实际上是一个freestandingcross compiler,用于operating system kernels的开发,因此它输出的代码不需要底层操作系统,因为输出代码是操作系统本身!)。

    这只是一个混淆问题,源于字段可能(并且确实)使用- 字符,该字符也用于分隔字段。在您的情况下,操作系统被认为是linux-gnueabi,也称为使用Embedded ARM ABI 的Linux 内核的GNU 操作系统。 Linux Kernel has historically been one of the most portable pieces of software in the world,因此预计可以移植到其他 ARM ABI,虽然我只知道 EABI...

    【讨论】:

    • 谢谢!所以Linux使用嵌入式ABI。另一个疑问是 ABI 如何与 C std 库(例如 GLibc)和操作系统相关联。(在这种特殊情况下,我认为 LibC 是使用使用 EABI 约定的编译器和由该编译器生成的机器代码编译的也使用 EABI..?是吗?
    • @BhavikAmeta:您(显然)正在使用交叉编译器(请参阅我的答案中的链接),因此您的编译器可能不是在 ARM EABI 上运行,而是生成它的代码。目标三元组实际上与 C 库无关。毕竟,这没有多大意义,因为 C 与 ABI 无关。例如,如果您用汇编语言编写程序,C 库字段将设置为什么? unknown?然后我们需要(还)另一个用于装配的工具链!反正有many other C libraries for GNU/Linux apart from Glibc
    猜你喜欢
    • 2011-08-23
    • 2012-10-26
    • 2019-05-07
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多