Compiler construction 编译和ABI有什么关系?

Compiler construction 编译和ABI有什么关系?,compiler-construction,abi,Compiler Construction,Abi,编译和ABI有什么关系 编译器的唯一任务是为操作系统和/或其他应用程序构建应用程序二进制接口(ABI) 关于ABI,引自: ABIs涵盖了数据类型等详细信息, 尺寸、尺寸和对齐方式;召唤 约定,它控制如何 传递函数的参数并 检索到的返回值;系统 呼叫号码以及如何使用应用程序 应向 操作系统;如果是一个 完整的操作系统ABI 目标文件、程序的二进制格式 图书馆等等 谢谢和问候 ABI描述底层操作系统的功能,并包括一些关于程序必须如何编译的规则。编译器的工作不是“构建”ABI,而是在创建可执行代码时

编译和ABI有什么关系

编译器的唯一任务是为操作系统和/或其他应用程序构建应用程序二进制接口(ABI)

关于ABI,引自:

ABIs涵盖了数据类型等详细信息, 尺寸、尺寸和对齐方式;召唤 约定,它控制如何 传递函数的参数并 检索到的返回值;系统 呼叫号码以及如何使用应用程序 应向 操作系统;如果是一个 完整的操作系统ABI 目标文件、程序的二进制格式 图书馆等等


谢谢和问候

ABI描述底层操作系统的功能,并包括一些关于程序必须如何编译的规则。编译器的工作不是“构建”ABI,而是在创建可执行代码时遵循ABI

嗯,编译器可能不会完全遵循ABI。它必须发出有效的机器代码,但例如,它可能不遵循内部函数调用的调用约定。当然,在编译代码和操作系统之间的边界上,编译器应该遵循ABI。

编译器必须从源代码输出目标文件。这取决于体系结构,例如寻址模式可用性、寄存器可用性,以及ABI中阐明的这些。此外,由于性能原因,操作系统与体系结构紧密耦合,因此除非您编写固件,否则操作系统对系统调用的调用约定以及任何此类相关细节都是ABI包的一部分


编译器用机器级操作码和数据替换高级源文本。根据刀具链,要求输出符合要求。例如,针对Windows的链接器将需要PE格式的对象文件来支持Windows库,如果工具链中的编译器输出为其他格式(如ELF),则需要其他格式。

谢谢!所以ABI是属于操作系统的规范,而不是其他任何规范,包括CPU及其指令集、编译器、编写源代码的语言以及程序/可执行文件?是的。它是为操作系统修复的。一个单独的程序根本没有贡献——它只是遵守它。谢谢。我只是在之前的评论中加了一句:“不(属于)其他任何东西,包括CPU及其指令集、编译器、编写源代码的语言以及程序/可执行文件?”。CPU/指令集将被视为ABI的一部分;编程语言不会,因为ABI是给定系统上所有程序使用的接口。谢谢!如果编译器没有完全遵循系统的ABI,那么它在系统上编译的代码是否可以在系统上运行?取决于您所说的“完全”是什么意思。如果编译后的应用程序根本不符合调用约定,即使调用库函数,调用这样的函数也会导致一些错误。另一种情况是应用程序不符合可执行文件/库格式。这意味着应用程序将不会运行,因为加载程序无法加载此类组件。换句话说,若编译后的应用程序在与操作系统交互的地方不遵循ABI,这将导致问题。它可以运行,但不能工作。或者工作,但不是绝对的。