问题标签 [abi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如果他们定义了标准 ABI,C/C++ 会“失去”什么?
标题说明了一切。我说的是 C/C++,因为两者都认为这是“实现问题”。我认为,定义标准接口可以简化在其之上构建模块系统以及许多其他好处。
如果他们定义了标准 ABI,C/C++ 会“失去”什么?
c - C 编译器如何实现返回大型结构的函数?
函数的返回值通常存储在堆栈或寄存器中。但是对于大型结构,它必须在堆栈上。这段代码在真正的编译器中必须进行多少复制?还是优化了?
例如:
(假设函数不能内联..)
compiler-construction - 什么是应用程序二进制接口 (ABI)?
我从来没有清楚地理解 ABI 是什么。请不要将我指向维基百科的文章。如果我能理解,我就不会在这里发这么长的帖子了。
这是我对不同界面的看法:
电视遥控器是用户和电视之间的接口。它是一个现有的实体,但本身无用(不提供任何功能)。遥控器上每个按钮的所有功能都在电视机中实现。
接口:
functionality
它是该功能之间的“现有实体”层consumer
。接口本身不做任何事情。它只是调用背后的功能。现在取决于用户是谁,有不同类型的界面。
命令行界面 (CLI)命令是现有实体,消费者是用户,功能位于后面。
functionality:
我的软件功能解决了我们描述此界面的某些目的。
existing entities:
命令
consumer:
用户图形用户界面 (GUI)窗口、按钮等是现有的实体,而消费者又是用户,功能落后。
functionality:
我的软件功能解决了我们描述这个接口的一些问题。
existing entities:
窗口、按钮等。
consumer:
用户应用程序编程接口(API)函数(或者更准确地说)接口(在基于接口的编程中)是现有的实体,这里的消费者是另一个程序而不是用户,功能再次位于这一层后面。
functionality:
我的软件功能解决了我们描述这个接口的一些问题。
existing entities:
函数,接口(函数数组)。
consumer:
另一个程序/应用程序。应用程序二进制接口 (ABI)这是我的问题开始的地方。
functionality:
???
existing entities:
???
consumer:
???
- 我用不同的语言编写了软件并提供了不同类型的接口(CLI、GUI 和 API),但我不确定我是否曾经提供过任何 ABI。
ABI 涵盖详细信息,例如
- 数据类型、大小和对齐方式;
- 调用约定,它控制函数的参数如何传递和返回值的检索;
- 系统调用号以及应用程序应如何对操作系统进行系统调用;
其他 ABI 标准化细节,例如
- C++ 名称修改,
- 异常传播,以及
- 同一平台上编译器之间的调用约定,但不需要跨平台兼容性。
谁需要这些细节?请不要说操作系统。我知道汇编编程。我知道链接和加载是如何工作的。我确切地知道里面发生了什么。
为什么 C++ 名称修饰会出现?我以为我们在二进制级别上讨论。为什么语言会出现?
无论如何,我已经下载了[PDF] System V Application Binary Interface Edition 4.1 (1997-03-18)来看看它到底包含什么。好吧,大部分都没有任何意义。
为什么它包含两章(第 4 章和第 5 章)来描述ELF文件格式?事实上,这是该规范仅有的两个重要章节。其余章节是“特定于处理器的”。无论如何,我认为这是一个完全不同的话题。请不要说ELF文件格式规范就是ABI。根据定义,它不符合成为接口的条件。
我知道,既然我们在这么低的层面上谈论它,它必须非常具体。但我不确定它是如何具体“指令集架构(ISA)”的?
在哪里可以找到 Microsoft Windows 的 ABI?
所以,这些是困扰我的主要问题。
linux - i386 和 x86-64 上 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么
以下链接解释了 UNIX(BSD 风格)和 Linux 的 x86-32 系统调用约定:
但是 UNIX 和 Linux 上的 x86-64 系统调用约定是什么?
c - 如何在汇编语言中使用 c 库函数 fgets?
如标题所述,如何在汇编语言中使用 c 库函数 fgets?确实,我想知道如何获取指向标准输入的文件指针。感谢您的回复。
c++ - GCC ABI 兼容性
据我了解,无法链接使用不同版本的 GCC 应用程序二进制接口 (ABI) 的库。每个版本的 GCC 都有 ABI 更改吗?如果我使用 GCC 4.3.2,是否可以链接使用 4.3.1 构建的库?是否有某种矩阵列出了我可以组合 GCC 版本的所有方式?
c++ - 维护 ABI:向 struct 添加构造函数
我们在共享库的修订版 1 中有一个结构,我们需要为它维护 ABI:
在修订版 2 中,我们将 Person 更改为:
为了保持源代码兼容性,我们想修改 Person 的 reversion 1,以便针对较新的头文件编译的代码将运行,而未重新编译的代码将运行。
我们是否可以使用两个新的非内联构造函数来执行以下操作:
我们正在使用 g++ 完成这一切。在使用 nm 查看生成的共享库时,我没有看到普通结构的构造函数或析构函数,所以我猜测未重新编译的代码只会像以前一样在调用站点构造 Person,这很好。任何重新编译的代码都将使用无参数构造函数。
我看到的唯一问题是,如果我们需要回滚到没有构造函数的旧版本的共享库,那么针对它编译的任何代码都会中断,但我并不担心这种情况。
gcc - 对 ABI 调用约定和拱门感到困惑
我对所有这些术语感到困惑:
ABI、调用约定和硬件架构。
ABI 与架构链接:x86-64 与 i386 具有不同的 ABI。但是你也可以定义自己的调用约定 cdecl ...
那么所有这些概念之间的联系是什么?哪个定义了另一个?
大多数情况下,我认为我对 ABI 感到困惑。你在调用约定的一部分里面放了什么?
谢谢
abi - API和ABI之间的区别
我是 Linux 系统编程的新手,在阅读 Linux 系统编程时遇到了 API 和 ABI 。
API定义:
API 定义了一个软件在源代码级别与另一个软件通信的接口。
ABI的定义:
API 定义了源接口,而 ABI 定义了特定架构上两个或多个软件之间的低级二进制接口。它定义了应用程序如何与自身交互、应用程序如何与内核交互以及应用程序如何与库交互。
程序如何在源代码级别进行通信?什么是源级别?它与源代码有任何关系吗?还是库的源代码包含在主程序中?
我知道的唯一区别是 API 主要由程序员使用,而 ABI 主要由编译器使用。
c - C 编译器能否生成指针为 32 位的 64 位可执行文件?
大多数程序都非常适合小于 4GB 的地址空间,但需要使用仅在 x64 架构上可用的新功能。
是否有可以使用 x64 寄存器和特定指令但保留 32 位指针以节省内存的编译器/平台?
是否有可能在遗留代码上透明地做到这一点?什么开关可以做到这一点?
或者
在保持 32 位指针的同时获得 64 位功能需要对代码进行哪些更改?