应用程序二进制接口混淆

时间:2015-05-20 19:38:36

标签: c compilation pascal abi

我知道在这里有很多关于ABI的问题,但它仍然是我不能完全理解的东西。

最近有人告诉我,当人们习惯写Pascal然后C变得更受欢迎时,会出现问题或混淆,因为编译后的Pascal会以相反的顺序将函数参数推送到C上。我质疑那不应该取决于目标平台而不是程序语言。不是ABI会决定这个吗?不是操作系统开发人员开发的ABI,而不依赖于编程语言吗?

很抱歉,问题很长。这只是我无法理解的事情。我试图完全了解幕后发生的事情,而不仅仅是能够编写代码。在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

ABI不是操作系统供应商的垄断者。程序可以部署为固件,甚至OS也是程序集合。因此,调用约定,如您所建议的可以被视为ABI规范的一部分,由HLL的编译工具链供应商(或汇编语言的程序员)选择。对于通过操作系统使用的计算机,制作应用程序的开发人员需要将其程序与OS库链接。如果这些库在作为OS的一部分部署时使用一个调用约定构建,则编译器开关或其他此类机制负责定位OS。因此,OS供应商在指定ABI方面有发言权。

答案 1 :(得分:0)

您可能会有一些不必要地联合起来的概念。在其最简单的形式中,OS提供了运行程序的框架。 ABI是API(应用程序编程接口)的具体实例。物联网设备可能没有操作系统(它可能只运行一个程序)但会使用ABI。不同的系统和编译器将创建不同的ABI。参数在堆栈上传递的顺序只是这些差异之一。编译器经常尝试将数据放在处理器寄存器中以避免使用堆栈(性能)。堆栈本身通常只是处理器上的一个特殊寄存器,它可以适当地递增和递减。对ABI重要的其他事情是字节顺序(大/小端),位数(基本数据类型的大小)以及负责堆栈管理的人(调用者或被调用者是否调整堆栈地址)。通常,ABI的性质主要取决于基于机器结构的方便性。

答案 2 :(得分:0)

ABI的目的是允许使用来自不同供应商的开发工具(编译器/链接器/等)开发的代码一起工作。没有任何硬性和快速的规则,例如" ABI是由操作系统供应商开发的#34;。 ABI只是一个可以遵循或忽略的文档。

我已经看过英特尔针对他们的x86处理器的ABI规范,如果我没记错的话,他们是特定于语言的(或者可能是部分语言特定的)。 ABI通常是特定于语言的,因为编程语言具有不同的功能,并且支持这些功能的最明显/最有效的方式将是特定于语言的。

此博文The history of calling conventions详细介绍。

相关问题