在我看来,C库几乎从来没有问题混合使用不同版本编译的库或(有时甚至是不同的编译器),并且许多语言似乎能够直接或以最小的努力与C库进行交互。
这是因为ABI是标准的吗?
答案 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,但他们认为合适。