问题标签 [itanium-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 投票
3 回答
5494 浏览

c++ - 用于维护 API 向后二进制兼容性的 GCC 与 MS C++ 编译器

我来自 Linux 世界,知道很多关于维护用 C++ 语言编写的动态库 API 的向后二进制兼容性 (BC) 的文章。其中之一是“C++ 的策略/二进制兼容性问题” ,它基于GCC 编译器使用的Itanium C++ ABI 。但是对于 Microsoft C++ 编译器(来自 MSVC),我找不到任何类似的东西。

我了解大多数技术适用于 MS C++ 编译器,并且我想发现与 ABI 差异(v-table 布局、修改等)相关的编译器特定问题

所以,我的问题如下:

  • 在维护 BC 时,你知道 MS C++ 和 GCC 编译器有什么区别吗?
  • 我在哪里可以找到有关 MS C++ ABI 或有关在 Windows 中维护 API BC 的信息?

任何相关信息将不胜感激。
非常感谢你的帮助!

0 投票
2 回答
2564 浏览

c++ - 键入特征以识别主要基类

如果我有一个类 Base,至少有一个虚函数,以及一个从该类单独继承的 Derived 类,那么(uintptr_t)derived - (uintptr_t)static_cast<Base*>(derived)即使 Derived 不是标准布局,也可以保证(由 Itanium ABI)为零。然而,在一般情况下,这不一定是真的(例如多重继承)。

是否可以编写一个特征来检测一个类是否是另一个类的主要基类?

Itanium ABI 中的有用部分:

http://refspecs.linux-foundation.org/cxxabi-1.83.html

主要基类

对于动态类,唯一的基类(如果有),它在偏移量 0 处共享虚拟指针。它是第一个(按直接基类顺序)非虚拟动态基类(如果存在)。

动态类

需要虚拟表指针的类(因为它或其基类具有一个或多个虚拟成员函数或虚拟基类)。

0 投票
1 回答
406 浏览

c++ - linux内核模块中的C++异常支持

2005 年 Dobb 博士的杂志发表了一篇关于 linux 内核补丁的文章。该补丁假装允许在内核空间中使用 Itanium C++ ABI。该补丁未被接受。该代码从网上消失了(我找不到它:))。

似乎该链接将我们发送到补丁的来源。页面上的地址导致页面不存在 。有很多页面链接到死地址。

那么有人有补丁的副本或任何其他信息吗?

谢谢。

0 投票
2 回答
132 浏览

c++ - 为什么即使 std::type_info 对象不同,我也可以捕获对象或 dynamic_cast?

我正在进行一项实验,并在我从程序中打开的程序和共享库中定义了相同的类,并确保程序在其动态表中没有类型信息对象的条目。然后我从共享库中抛出该类的一个对象,并尝试使用相同的类类型来捕获它。

我预计 linux 和 gcc 上的实现不会捕获异常,因为程序和共享库中两个类的类型信息对象不同,因此只有在运行时对损坏的类进行字符串比较时,才有可能匹配名字。

它仍然匹配,我什至可以对共享库中定义的类进行动态向下转换。谁能解释一下在这种情况下实现是如何工作的,好吗?

编辑

根据 Itanium ABI 的陈述,观察到的行为似乎不符合标准。我在这里想念什么?

因此,除了指向不完整类型的直接或间接指针外,等式和不等式运算符在对这些 type_info 对象进行操作时可以写成地址比较:两个 type_info 结构描述相同的类型当且仅当它们是相同的结构(同时地址)。

由于这两个 typeinfo 有不同的地址,因此所描述的结构代表不同的类型。因此,强制转换应该失败并且不应该捕获异常。

0 投票
1 回答
1066 浏览

c++ - 在 Itanium C++ ABI 中,为什么模板函数的错误名称无法解析依赖的 typedef?

例如:

为什么要baz<int>提到这种被破坏的形式foo?怎么不是_Z3bazIiEvi

这显然是 C++17std::default_order<T>提案在水中死气沉沉的原因。

0 投票
0 回答
56 浏览

c++ - 为什么 Itanium ABI 需要在内存中分配一些值参数并通过引用传递?

如果参数类型对于调用而言是非平凡的,则调用者必须为临时分配空间并通过引用传递该临时

https://itanium-cxx-abi.github.io/cxx-abi/abi.html#value-parameter

并且为了调用目的而 *non-trivial 定义为:

  • 它有一个重要的复制构造函数、移动构造函数或析构函数
  • 它的所有复制和移动构造函数都被删除。

https://itanium-cxx-abi.github.io/cxx-abi/abi.html#non-trivial

这有什么明确的原因吗?

0 投票
0 回答
15 浏览

c++ - Itanium ABI 中压缩的自定义替换

Itanium ABI 有一些压缩标识符以进行名称修改的规则:例如,给定

该函数std::string::f()被编码为_ZN3foo6string1fEv但给定

该函数foo::string::f()被编码为_ZNSt6string1fEv更短一些。还有其他快捷方式,例如 for std::allocatorstd::basic_string等。

我的问题是:有没有办法为我自己的图书馆指定这样的规则?例如,我有很多包含

等等......这无缘无故地让我的二进制文件膨胀。

抢先回答问题:

  • 我已经使用压缩的调试信息,这还不够
  • 我必须导出这些符号(但可以假设动态调用它们的代码知道我将进行的任何更改,我控制着整个工具链)