编译和ABI如何相关?
编译器是否只能为OS和/或其他应用程序构建应用程序二进制接口(ABI)?
关于ABI,引自Wikipedia:
ABI涵盖数据类型等详细信息, 大小和对齐;呼唤 惯例,控制如何 函数的参数传递和 检索返回值;系统 电话号码以及如何申请 应该进行系统调用 操作系统;在一个案例中 完整的操作系统ABI ,. 二进制格式的目标文件,程序 图书馆等。
谢谢和问候!
答案 0 :(得分:4)
ABI描述了底层操作系统的功能,并包含了一些关于如何编译程序的规则。编译器的工作不是“构建”ABI,而是在创建可执行代码时符合到ABI。
答案 1 :(得分:2)
好吧,编译器可能不会完全遵循ABI。它必须发出有效的机器代码,但是例如它可能不遵循内部函数调用的调用约定。但是,当然,在编译代码和操作系统之间的边界上,编译器应该遵循ABI。
答案 2 :(得分:0)
编译器必须从源输出目标文件。这取决于架构,例如寻址模式可用性,可用寄存器以及ABI中阐明的这些。此外,出于性能原因,OS与架构紧密耦合,因此除非您编写固件,否则OS的系统调用调用约定以及任何此类相关详细信息都是ABI parcel的一部分。
编译器通过机器级操作码和数据替换高级源文本。根据工具链的要求,输出必须符合要求。例如,针对Windows的链接器将需要PE格式的目标文件以支持Windows库,并且如果工具链中的编译器输出到其他格式之一(如ELF),则需要其他格式。