ABI是C标准的一部分吗?

时间:2013-02-14 21:44:41

标签: c abi

在我看来,C库几乎从来没有问题混合使用不同版本编译的库或(有时甚至是不同的编译器),并且许多语言似乎能够直接或以最小的努力与C库进行交互。

这是因为ABI是标准的吗?

4 个答案:

答案 0 :(得分:7)

ABI没有编入语言标准。您可以获得任何C标准草稿的副本,以便亲自查看。

并且有充分的理由让ABI不符合标准。该标准无论如何都无法预见可以实现C编译器的所有硬件和操作系统。

答案 1 :(得分:2)

ABI绝对不是标准。至少,不是C标准。每个操作系统或工具链都指定了这些内容,但语言本身却没有。例如,尝试在Linux机器上运行Windows程序。

答案 2 :(得分:1)

ABI由操作系统和/或工具链定义,并未由标准定义。它定义了例如如何将params传递给函数调用。堆栈框架具有什么布局或如何调用系统调用。

大多数语言能够与C库交互的原因很可能是因为大多数操作系统(或多或少)用C语言编写,将C库公开为API并基于此定义ABI。如果用某种语言编写的库想要连接特定的操作系统,它必须能够连接该操作系统的ABI。

答案 3 :(得分:1)

ABI不是C标准的一部分。然而,一直在努力使ABI标准化。引自“Linux System Programming”:

  

虽然已经为定义一个给定的架构的单个ABI做了几次尝试   跨越多个操作系统(特别是对于Unix系统上的i386),   努力没有取得多大成功。相反,操作系统 - Linux   包含 - 倾向于定义他们自己的ABI,但他们认为合适。