编译和 ABI 有什么关系?
编译器的唯一工作是为操作系统和/或其他应用程序构建应用程序二进制接口 (ABI)?
关于 ABI,引自维基百科:
ABI 涵盖数据类型、大小和对齐方式等细节;调用约定,它控制函数的参数如何传递和返回值的检索;系统调用号以及应用程序应如何对操作系统进行系统调用;而在完整的操作系统ABI的情况下,目标文件、程序库等的二进制格式。
谢谢并恭祝安康!
编译和 ABI 有什么关系?
编译器的唯一工作是为操作系统和/或其他应用程序构建应用程序二进制接口 (ABI)?
关于 ABI,引自维基百科:
ABI 涵盖数据类型、大小和对齐方式等细节;调用约定,它控制函数的参数如何传递和返回值的检索;系统调用号以及应用程序应如何对操作系统进行系统调用;而在完整的操作系统ABI的情况下,目标文件、程序库等的二进制格式。
谢谢并恭祝安康!
ABI 描述了底层操作系统的特性,并包括一些关于如何编译程序的规则。编译器的工作不是“构建” ABI,而是在创建可执行代码时符合ABI。
好吧,编译器可能不会完全遵循 ABI。它必须发出有效的机器代码,但例如它可能不遵循内部函数调用的调用约定。但当然,在编译代码和操作系统之间的边界上,编译器应该遵循 ABI。
编译器必须从源输出目标文件。这取决于架构,例如寻址模式的可用性、可用的寄存器等,这些都在 ABI 中进行了说明。此外,出于性能原因,操作系统与架构紧密耦合,因此除非您正在编写固件,否则操作系统对系统调用的调用约定以及任何此类相关细节都是 ABI 包裹的一部分。
编译器用机器级操作码和数据替换高级源文本。根据工具链,输出需要遵守。例如,针对 Windows 的链接器将需要 PE 格式的目标文件来支持 Windows 库,如果工具链中的编译器输出到这些其他格式之一(如 ELF),则需要其他格式。