问题标签 [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 投票
1 回答
144 浏览

ios - iOS 2.x ABI 中的 R9 用法?

iOS ARM ABI 中的 R9 寄存器是做什么用的?在 ABI 文档中,它说“寄存器 R9 有特殊用途”,但没有实际说明它的用途。

0 投票
3 回答
5606 浏览

c++ - C++ 模块和 C++ ABI

我一直在阅读 C++ 模块提案(最新草案),但我不完全理解它旨在解决什么问题。

其目的是允许由一个编译器构建的模块供任何其他编译器使用(当然,在相同的操作系统/架构上)?也就是说,该提案是否等同于标准化 C++ ABI?

如果没有,是否正在考虑另一个提案来标准化 C++ ABI 并允许编译器互操作?

0 投票
3 回答
4252 浏览

linux - 程序启动时的默认寄存器状态是什么(asm,linux)?

当程序启动时(linux,elf)- , 等是否有零eaxebx或者可以有任何东西(我没有做任何调用或使用外部库)?在我的机器上确实如此,我可以在编写 asm 程序时中继这种行为吗?

0 投票
1 回答
1482 浏览

c++ - 混合 C++ ABI 以针对遗留库进行构建

情况就是这样,我有一个使用最新 GCC (4.3.3) 的 C++ 代码库,但我需要链接到使用 GCC 3.2.3 构建的旧库。没有更新版本的库可用,我不能没有它,而且它是封闭源代码,因此无法重建。

这似乎造成了一个问题,因为 GCC 4.3.3 和 3.2.3 之间存在 ABI 不兼容性,所以我试图看看我有什么解决这个问题的选择。

一些额外的细节:

  • 我可以使用 -fabi-version=1 重建代码库中的所有内容以获得正确的 ABI 版本,但我依赖于 libstdc++ 版本 6 中的一些新功能。
  • 代码库之外的所有 C++ 库依赖项都是开源的,所以我可以根据需要重新构建它们,除了这个库。
  • 许多无法重建或难以重建的 C 库依赖项。
  • 旧库似乎依赖于一些 libstdc++ 版本 5 功能

到目前为止,我已经尝试过:

  • 使用 -fabi-version=1 重建所有 C++ 代码和依赖库,并链接到 libstdc++ 版本 6。这会失败,并出现一些 C++ 标准库符号的未定义符号错误。
  • 与上面相同,但在 libstdc++ 5 的共享库中额外链接,这解决了链接器问题,但似乎导致在运行时在遗留库中混合两个版本,并导致崩溃。

我阅读了这个页面: http: //gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html这似乎表明可以在应用程序中混合 C++ ABI 版本以满足库之间不同的依赖关系。不过,它在这里似乎不太好用,除非我遗漏了一些东西。

有任何想法吗?

0 投票
2 回答
6215 浏览

c++ - Visual Studio 版本之间的库 ABI 兼容性

我有两种情况。假设我有 3 个导出 C++ 符号的共享库,每个库都是用 VS7.1、VS8 和 VS9 构建的。我在 VS9 中编译了所有 3 个。出于某种原因,这行得通。我不需要为 VS9 链接器重新编译 VS9 中的前 2 个库来成功找到符号并链接它们。

现在,如果我有一个只使用 C 语法(extern "C")导出符号的库,这是否相同?我听说有人说 C 的 ABI 是标准化的,因此可以保证您可以在所有版本的 Visual Studio 中使用在 Visual Studio 8 中编译的 C 库。

基本上,所有这些东西的组合是令人困惑的。我不确定在不同版本的 Visual Studio 之间链接 C++ 和基于 C 的共享库(使用它们相应的导入库)之间有什么保证。我想听到关于 CC++ 导入或静态库在任何其他版本的 Visual Studio 上的向前/向后兼容性的普遍共识。

我之所以出现这种情况,是因为我使用的一些闭源库是在 Visual Studio .NET 2003 (VS7.1) 中编译的。我的团队认为这将我们锁定在 VS 7.1 编译器上,但是我已经在 VS8 和 VS9,甚至 VS2010 中测试了这些库,并且它们链接得很好。但是,我不确定这其中的内在危险。请注意,有问题的库有一个 C 变体和一个 C++ 变体。基本上,C 变体是标准 C 导出,而 C++ 库是 C 库和导出类的抽象。

0 投票
4 回答
1803 浏览

performance - x86-64 ISA 的 32 位指针:为什么不呢?

x86-64 指令集增加了更多寄存器和其他改进,以帮助简化可执行代码。然而,在许多应用程序中,增加的指针大小是一种负担。每个指针中多余的未使用字节会阻塞缓存,甚至可能溢出 RAM。例如,GCC 使用-m32标志构建,我认为这就是原因。

可以加载 32 位值并将其视为指针。这不需要额外的指令,只需加载/计算 32 位并从结果地址加载。然而,这个技巧不会是可移植的,因为平台有不同的内存映射。在 Mac OS X 上,保留整个低 4 GiB 地址空间。尽管如此,对于我编写的一个程序,在使用之前将其添加0x100000000L到 32 位“地址”中会大大超过真正的 64 位地址,或者使用-m32.

拥有 32 位 x86-64 平台是否存在任何根本障碍?我想支持这样的嵌合体会增加任何操作系统的复杂性,任何想要最后 20% 的人都应该让它工作™,但它似乎仍然最适合各种计算密集型程序。

0 投票
5 回答
137785 浏览

assembly - 什么是被调用者和调用者保存的寄存器?

我在理解调用者和被调用者保存的寄存器之间的区别以及何时使用什么时遇到了一些麻烦。

我正在使用 MSP430:

程序:

上面的代码是一个被调用者,并在教科书示例中使用,因此它遵循约定。R6 和 R7 被调用者保存,R12 被调用者保存。我的理解是,被调用者保存的 regs 不是“全局的”,因为在过程中更改其值不会影响它在过程之外的值。这就是为什么您必须在开始时将新值保存到被调用者 reg 中的原因。

R12,保存的调用者是“全局的”,因为缺少更好的词。该程序的作用在通话后对 R12 产生持久影响。

我的理解正确吗?我错过了其他东西吗?

0 投票
2 回答
514 浏览

c++ - 如何指示编译器为虚函数生成别名?

有关背景,请参阅此问题

基本上,我有一个类的以下定义

有没有办法指示编译器生成两个可以解析为的符号foo4?也就是说,我希望如果一个可执行文件要求动态链接器解析_ZN7MyClass4foo4Edi(符号代表MyClass::foo4(double, int))和其他一些符号(比方说_ZN7MyClass9reserved1Ev,一个符号代表MyClass::reserved1()),动态链接器将两者都解析为&MyClass::foo4(double, int). 我在 Linux 上使用相当现代的 GCC。

0 投票
7 回答
325 浏览

c++ - 从类返回指针。谁负责删除?

我有一个实现二进制兼容接口(用作共享库)的 C++ 类,因此只返回 C 类型。字符串作为 const char*、void 指针和指向具有二进制兼容接口的其他类的指针。问题是我应该如何组织内存管理,我应该返回指向现有类数据的常量指针(用户使用过时指针的危险),然后我自己释放内存,或者更确切地说是指向一些堆变量的指针并让用户负责删除这些指针以后,还是???有没有一些通用的指导方针?

0 投票
2 回答
2625 浏览

c++ - 关于 C/C++ 静态库的推理

我从来没有想过下面的问题,但是因为我现在不得不处理我的代码中的一堆依赖项,所以我认为我最好把我的事实弄清楚。让我们将其限制为现代 Linux 版本,比如 ubuntu amd64。

由于静态库不包含动态库引用,如何在静态库中解析未定义的符号?依赖二进制文件可以动态加载未定义的符号,还是必须在编译时由另一个静态库或目标文件解析符号?

编译器是否可以通过链接动态库来解决依赖关系(依赖于静态库的应用程序),如果是这样,代码文本是否会通过静态解析到生成的二进制文件中,或者是否存在动态引用?

例如,静态库L使用mallocfromlibc6.so并将由 application 使用A。是否会动态使用 libc6.soLA的 malloc?