ABI与编译器:ABI是由内核和工具链定义和实现的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABI与编译器:ABI是由内核和工具链定义和实现的相关的知识,希望对你有一定的参考价值。

http://book.51cto.com/art/201412/460857.htm

《Linux系统编程(第2版)》第1章入门和基本概念,这一章着眼于Linux系统编程的基础概念并从程序员视角探索Linux系统。本节为大家介绍ABI。

1.2.2  ABI

API定义了源码接口,而ABI定义了两个软件模块在特定体系结构上的二进制接口。它定义了应用内部如何交互,应用如何与内核交互,以及如何和库交互。API保证了源码兼容,而ABI保证了“二进制兼容(binary compatibility)”,确保对于同一个ABI,目标代码可以在任何系统上正常工作,而不需要重新编译。

ABI主要关注调用约定、字节序、寄存器使用、系统调用、链接、库的行为以及二进制目标格式。例如,调用约定定义了函数如何调用,参数如何传递,分别保留和使用哪些寄存器,调用方如何获取返回值。

尽管曾经在不同操作系统上为特定的体系结构定义一套唯一的ABI,做了很多努力,但是收效甚微。相反地,操作系统(包括Linux)往往会各自定义自己独立的ABI,这些ABI和体系结构紧密关联,绝大部分ABI表示了机器级概念,比如特定的寄存器或汇编指令。因此,在Linux,每个计算机体系结构都定义了自己的ABI。实际上,我们往往通过机器体系结构名称来称呼这些ABI,如Alpha或x86-64。因此,ABI是操作系统(如Linux)和体系结构(如x86-64)共同提供的功能。

系统编程需要有ABI意识,但通常没有必要记住它。ABI并没有提供显式接口,而是通过工具链(toolchain),如编译器、链接器等来实现。尽管如此,了解ABI可以帮助你写出更优化的代码,而如果你的工作就是编写汇编代码或开发工具链(也属于系统编程范畴),了解ABI就是必需的。

ABI是由内核和工具链定义和实现的。 

以上是关于ABI与编译器:ABI是由内核和工具链定义和实现的的主要内容,如果未能解决你的问题,请参考以下文章

gethGo语言调用智能合约 | 一起来学区块链

NDK交叉编译之自定义工具链

错误:在 ABI 的 NDK 工具链文件夹中找不到工具链,前缀为:arm-linux-androideabi

Flutter - 在 ABI 的 NDK 工具链文件夹中找不到工具链

在 ABI 的 NDK 工具链文件夹中找不到工具链,前缀为:mips64el-linux-android 如何修复?

错误:在 ABI 的 NDK 工具链文件夹中找不到工具链,前缀为:arm-linux-androideabi