【问题标题】:Is the ABI part of the C standard? [duplicate]ABI 是 C 标准的一部分吗? [复制]
【发布时间】:2013-02-14 21:44:40
【问题描述】:

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

这都是因为 ABI 是标准的吗?

【问题讨论】:

  • 尝试在 ARM 机器上将使用 softfp ABI 构建的库与使用硬浮点 ABI 构建的应用程序结合起来。你会感到惊讶。
  • MinGW 和 MSVC 编译代码经常无法协同工作。 mingw.org/category/wiki/msvc 这个问题在很多其他地方也出现过;标准建议是使用相同的工具链构建所有内容。

标签: c abi


【解决方案1】:

ABI 未编入语言标准。您可以获取任何 C 标准草案的副本以自己查看。

ABI 不在标准中是有充分理由的。无论如何,该标准无法预见可以实现 C 编译器的所有硬件和操作系统。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      ABI 由操作系统和/或工具链定义,而不是由标准定义。例如,它定义了参数如何传递给函数调用。 stackframe 有什么布局或如何调用系统调用。

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

      【讨论】:

      • 接受,因为这是解释为什么 C 接口似乎可以普遍访问的唯一答案。
      【解决方案4】:

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

      尽管在为给定架构定义单个 ABI 方面已经进行了多次尝试 跨多个操作系统的架构(尤其是 Unix 系统上的 i386), 努力没有取得多大成功。相反,操作系统——Linux 包括——倾向于定义他们自己认为合适的 ABI。

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 2016-07-29
        • 2014-07-04
        相关资源
        最近更新 更多