编译和ABI如何相关?

时间:2011-03-27 19:17:35

标签: compiler-construction abi

编译和ABI如何相关?

编译器是否只能为OS和/或其他应用程序构建应用程序二进制接口(ABI)?

关于ABI,引自Wikipedia

  

ABI涵盖数据类型等详细信息,   大小和对齐;呼唤   惯例,控制如何   函数的参数传递和   检索返回值;系统   电话号码以及如何申请   应该进行系统调用   操作系统;在一个案例中   完整的操作系统ABI ,.   二进制格式的目标文件,程序   图书馆等。

谢谢和问候!

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

编译器通过机器级操作码和数据替换高级源文本。根据工具链的要求,输出必须符合要求。例如,针对Windows的链接器将需要PE格式的目标文件以支持Windows库,并且如果工具链中的编译器输出到其他格式之一(如ELF),则需要其他格式。