C++ 为什么应用程序二进制接口对编程很重要
我不明白为什么ABI是开发用户空间应用程序的重要环境。操作系统的系统调用集是否被视为ABI?但是如果是这样的话,那么不是所有关于系统调用的复杂性都封装在标准库中了吗C++ 为什么应用程序二进制接口对编程很重要,c++,c,operating-system,binary-compatibility,abi,C++,C,Operating System,Binary Compatibility,Abi,我不明白为什么ABI是开发用户空间应用程序的重要环境。操作系统的系统调用集是否被视为ABI?但是如果是这样的话,那么不是所有关于系统调用的复杂性都封装在标准库中了吗 因此,ABI兼容性是否仅与在不同平台上运行静态链接的应用程序相关,因为系统调用将嵌入到二进制文件中?系统调用也遵循ABI-系统调用接口因操作系统而异 将应用程序和标准库静态链接到其中将把它绑定到一个系统调用ABI中。例如,FreeBSD只允许通过仿真模块使用Linux系统调用ABI 定义一组系统通用的对齐、调用约定和数据类型。这使得
因此,ABI兼容性是否仅与在不同平台上运行静态链接的应用程序相关,因为系统调用将嵌入到二进制文件中?系统调用也遵循ABI-系统调用接口因操作系统而异 将应用程序和标准库静态链接到其中将把它绑定到一个系统调用ABI中。例如,FreeBSD只允许通过仿真模块使用Linux系统调用ABI 定义一组系统通用的对齐、调用约定和数据类型。这使得ABI非常重要,如果你正在做任何类型的动态链接;没有it,一个应用程序的代码无法调用另一个应用程序提供的代码 所以,没有。ABI兼容性与所有动态链接相关(对于静态链接则较少)
再次强调系统的ABI影响应用程序间的工作以及应用程序到操作系统的工作,这是值得的。ABI比可用的系统调用更重要。它还通常描述参数传递给函数的实际方式以及结构和对象在内存中的布局。如果没有一致的ABI,不同编译器生成的代码可能无法相互调用——如果调用foo(a,b),一个编译器将a和b推到堆栈上,而另一个编译器将a和b推到寄存器中,则会出现ABI冲突。不兼容的ABI就是为什么即使OSX、Linux、Solaris、Windows和*BSD都在Intel x86 CPU上运行,在一个操作系统上编译的简单POSIX only hello world程序,如果不使用任何特定于供应商的或专有的系统调用和/或库,则在为另一个操作系统编译时,通常无法在一个操作系统上运行* ABI对程序员来说并不重要,因为我们已经本能地知道你不能在Mac上运行Windows应用程序。即使是非程序员(好莱坞编剧除外)也知道这一点。当编译器编写人员需要针对特定环境时,这一点非常重要
*注意:有些操作系统(如Linux和BSD)支持外部ABI,因此有时可以在BSD上执行简单的Linux命令行程序,而无需修改。当然也有类似于Simulink的仿真层。 < P>不要忘记在C++中实现名字的方式是ABI < P>的一部分。只有当你希望你的二进制文件在其他环境中运行而不需要重新编译时,你可能需要一些地方考虑ABI:
如果您只关心编译符合标准的代码,那么ABI并不重要。如果你违反了标准,做了一些不可移植的事情,比如把
char*
转换成long*
,这就有点关系了。在编写大量汇编代码时,这一点更为重要。编写链接器或调试器之类的东西,可以体现出要完成的大部分工作。哪些著名的ABI值得了解?或者什么是ABI的具体示例?唯一广为人知的ABI是为每个平台严格定义的“C”。每个C++编译器都实现了它自己的ABI,因此来自不同编译器的目标代码通常不兼容。C'往往是Web上所有不同语言之间的绑定代码。