问题标签 [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.

0 投票
8 回答
5933 浏览

c++ - 如果他们定义了标准 ABI,C/C++ 会“失去”什么?

标题说明了一切。我说的是 C/C++,因为两者都认为这是“实现问题”。我认为,定义标准接口可以简化在其之上构建模块系统以及许多其他好处。
如果他们定义了标准 ABI,C/C++ 会“失去”什么?

0 投票
5 回答
7876 浏览

c - C 编译器如何实现返回大型结构的函数?

函数的返回值通常存储在堆栈或寄存器中。但是对于大型结构,它必须在堆栈上。这段代码在真正的编译器中必须进行多少复制?还是优化了?

例如:

(假设函数不能内联..)

0 投票
17 回答
154932 浏览

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?

所以,这些是困扰我的主要问题。

0 投票
4 回答
140448 浏览

linux - i386 和 x86-64 上 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么

以下链接解释了 UNIX(BSD 风格)和 Linux 的 x86-32 系统调用约定:

但是 UNIX 和 Linux 上的 x86-64 系统调用约定是什么?

0 投票
1 回答
1562 浏览

c - 如何在汇编语言中使用 c 库函数 fgets?

如标题所述,如何在汇编语言中使用 c 库函数 fgets?确实,我想知道如何获取指向标准输入的文件指针。感谢您的回复。

0 投票
3 回答
31487 浏览

c++ - GCC ABI 兼容性

据我了解,无法链接使用不同版本的 GCC 应用程序二进制接口 (ABI) 的库。每个版本的 GCC 都有 ABI 更改吗?如果我使用 GCC 4.3.2,是否可以链接使用 4.3.1 构建的库?是否有某种矩阵列出了我可以组合 GCC 版本的所有方式?

0 投票
5 回答
930 浏览

c++ - 维护 ABI:向 struct 添加构造函数

我们在共享库的修订版 1 中有一个结构,我们需要为它维护 ABI:

在修订版 2 中,我们将 Person 更改为:

为了保持源代码兼容性,我们想修改 Person 的 reversion 1,以便针对较新的头文件编译的代码将运行,而未重新编译的代码将运行。

我们是否可以使用两个新的非内联构造函数来执行以下操作:

我们正在使用 g++ 完成这一切。在使用 nm 查看生成的共享库时,我没有看到普通结构的构造函数或析构函数,所以我猜测未重新编译的代码只会像以前一样在调用站点构造 Person,这很好。任何重新编译的代码都将使用无参数构造函数。

我看到的唯一问题是,如果我们需要回滚到没有构造函数的旧版本的共享库,那么针对它编译的任何代码都会中断,但我并不担心这种情况。

0 投票
1 回答
263 浏览

gcc - 对 ABI 调用约定和拱门感到困惑

我对所有这些术语感到困惑:

ABI、调用约定和硬件架构。

ABI 与架构链接:x86-64 与 i386 具有不同的 ABI。但是你也可以定义自己的调用约定 cdecl ...

那么所有这些概念之间的联系是什么?哪个定义了另一个?

大多数情况下,我认为我对 ABI 感到困惑。你在调用约定的一部分里面放了什么?

谢谢

0 投票
11 回答
82519 浏览

abi - API和ABI之间的区别

我是 Linux 系统编程的新手,在阅读 Linux 系统编程时遇到了 API 和 ABI 。

API定义:

API 定义了一个软件在源代码级别与另一个软件通信的接口。

ABI的定义:

API 定义了源接口,而 ABI 定义了特定架构上两个或多个软件之间的低级二进制接口。它定义了应用程序如何与自身交互、应用程序如何与内核交互以及应用程序如何与库交互。

程序如何在源代码级别进行通信?什么是源级别?它与源代码有任何关系吗?还是库的源代码包含在主程序中?

我知道的唯一区别是 API 主要由程序员使用,而 ABI 主要由编译器使用。

0 投票
10 回答
2193 浏览

c - C 编译器能否生成指针为 32 位的 64 位可执行文件?

大多数程序都非常适合小于 4GB 的地址空间,但需要使用仅在 x64 架构上可用的新功能。

是否有可以使用 x64 寄存器和特定指令但保留 32 位指针以节省内存的编译器/平台?

是否有可能在遗留代码上透明地做到这一点?什么开关可以做到这一点?

或者

在保持 32 位指针的同时获得 64 位功能需要对代码进行哪些更改?