abi相关内容
C ++内联命名空间的基本原理是源和二进制兼容性(参见Herb Sutter的论文 N2535 ),但在引入内联命名空间时,我还无法找到现有库的保留二进制兼容性的好例子,是可能的。 (有关更多信息和源兼容性示例,请参阅 this question ) (解决相关问题,使用内联命名空间引入不兼容性,请参阅这个问题) 如果这是我们当前的库(例如mylib.dll),它是与客户共享的,
..
关于使用 const 函数参数我听说在某些OS X系统中,参数的常数被转换为函数签名。例如,如果在接口头文件中有如下声明: int f(int argument); 但如果只实现此功能: int f(int const argument); 那么这可能导致OS X上的链接失败方式对C ++函数签名包括参数的常量。 这是正确的mangl
..
这里的情况,我有一个C ++代码库使用最近的GCC(4.3.3),但我需要链接到一个旧的库,它是使用GCC 3.2.3构建的。没有更新版本的库可用,我不能去没有它,它是关闭源,所以它不能重建。 这似乎提出了一个问题,因为有GCC 4.3.3和3.2.3之间的ABI不兼容,所以我试图看看我的选项是用于解决这个。 一些额外的细节: 我可以使用-fabi-version = 1重建我的
..
我使用MinGW(4.8.0 dw2 posix)编写了一个C ++库。此库用于另一个使用另一个编译器(在本例中为msvc)的C ++项目。 参考这我重新设计了我的C ++库。有两件事情我不知道该怎么办: 我可以使用命名空间吗? 我注意到MinGW上的time_t是32位,而msvc是64位。我可以做什么? 1) 这打破了ABI: // Window.h
..
我想写一个快速和脏的诽谤的诽谤。我找到了一个一段代码,它使用 abi :: __ cxa_demangle ,但我不知道它需要哪个头。显而易见的选择是 ABI.h ,但是: demangle.cpp:2:10:fatal error:'ABI.h'file not found #include ^ 我需要使用 abi :: __ cxa_deman
..
我有一个问题在MS Visual C ++ DLL库和Qt程序之间共享“std :: string”数据。 我有: 在Visual C ++ 2010 Express中编写的DLL库,它导出一个方法: extern“C”__declspec(dllexport)int Init(ITest * commandTest); 抽象接口“ITest”和实现它的类:
..
Java Native Interface(JNI)是否受C ++ ABI兼容性问题的影响? 我正在开发一个Java应用程序。我想使用Java本机接口(JNI)来调用C ++库中的函数。我可以访问的C ++库的代码,我可以重建它,但我可能需要。 (例如,我可以静态链接C ++运行时。) 我可以要求我的用户拥有JRE 6或更大,但是我不能要求他们有任何 同事指示我访问此博客文章:
..
我有一个DLL需要访问存储在主机应用程序的STL容器中的数据。因为C ++没有标准的ABI,我想支持不同的编译器,应用程序和DLL之间的接口基本上必须保持原有的数据。 是相对直接的。您可以简单地返回向量的内存块,因为它保证是连续的: //返回向量
..
当Microsoft最初于2012年9月发布Visual Studio 2012时,他们宣布了更经常地为Visual Studio提供更新的计划。从那时起,他们发布了 2012年11月的Visual Studio 2012更新1(Visual Studio 2012.1)和 Visual Studio 2012 Update 2(Visual Studio 2012.2)。 我的问题是:更新
..
我们最近因为 GCC 5.1,libstdc ++和Dual ABI 。看起来 Clang不知道GCC内联命名空间更改,因此它生成代码基于一组命名空间或符号,而GCC使用另一组命名空间或符号。在链接时,由于缺少符号而出现问题。 如果我解析 Dual ABI 页面,它看起来像是在 _GLIBCXX_USE_CXX11_ABI 和 abi :: cxx11 有一些额外的困难。有关详情,请访问红帽
..
我被告知: [ABIs]保证结构的精确布局,每个成员的字节偏移, 但我一直相信填充和填充对齐未指定且不可靠。 Itanium ABI (GCC使用)实际上指定了这些东西(只要我可以告诉,它超出指定范围后不会显示) 如果是,如 __ attribute__ ((packed))适合吗?它们最终通过改变事物的一致性来破坏ABI? 或者,正如引用所暗示的,在工具链之间仅仅包
..
在下面的C ++源程序集中。为什么RAX推送到堆栈? RAX,我理解从ABI可以包含调用函数中的任何东西。但是我们将它保存在这里,然后将堆栈移回8个字节。所以在堆栈上的RAX,我认为只是相关的 std :: __ throw_bad_function_call()操作...? 代码: - #include
..
我有一些静态库,我不是所有者,用旧版本的g ++编译(4.3.2,c ++ 11 / c ++ 0x未激活)。 当我用g ++ 4.6(无c ++ 11)编译我的代码,并使用这些 静态库链接它(使用g ++ 4.6),它链接很好,我似乎不在运行时获取任何问题(未测试的一切)。 所以我试着认为向前兼容性是好的。 现在我想编译我的代码与gcc 4.8与c ++ 11和仍然链接它与那些相
..
请考虑这个计划: #include struct S { S(){print(); } void print(){printf(“%p \\\ ”,(void *)this); } }; S f(){return {}; } int main(){f()。print(); } 据我所知,只有一个 S 这里构造的对象。没有发生复制错误
..
据我所知,不可能链接使用不同版本的GCC的应用程序二进制接口(ABI)的库。每个版本的GCC是否有ABI更改?如果我使用GCC 4.3.2,是否可以链接一个用4.3.1构建的库?是否有一个列出所有可以组合GCC版本的方法的矩阵? 解决方案 官方ABI页面指向 ABIcheck 。这个工具可以做,你想要什么。
..
我创建一个修改printf的实施,我不知道对这些问题的答案。 请问零工作作为一个空字符串? (为的printf(“%S”,0)允许?) 我猜没有,因为0是一个 INT 。但后来这提示了这个问题: 确实 NULL 工作作为一个空字符串? (IS 的printf(“%S”,NULL)允许?) 从逻辑上讲,我觉得应该是肯定的,因为 NULL 意味着一个指针;但很多实现似乎的#define
..
我已经得到了与LLVM写一个编译器,我希望我的ABI的兼容性。例如,我发现很难找到真正的Windows的x86或Linux对于C ABI规范文件。而且我发现的那些解释在RAX / EAX /等方面,而不是我可以使用IR条款。 到目前为止,我想我已经想通了LLVM对待invisibly-也就是说,它认为自己的成员每一个不同的参数聚集。因此,例如,在Windows 64,如果我要处理的集合类的文
..
我读到,当一个函数调用是由程序进行,被调用函数必须知道如何返回到它的调用者。 我的问题是:如何被调用的函数知道如何返回到它的调用者?有没有通过编译器的幕后工作机制? 解决方案 编译器遵循特定的“调用约定”,定义为您的目标ABI的一部分。该调用约定将包括系统知道返回到什么地址的方法。调用约定通常需要硬件对过程调用的支持优势。英特尔,例如,返回地址被压入堆栈: ...处理器将跟随在 E
..
与1999年版开始,ISO C标准定义了一个标准的头< stdint.h> 定义,除其他事项外,该类型定义还会将intmax_t 和 uintmax_t型。这些候,分别为“A(签字|无符号)整数能够重新presenting中的任何类型的任何值(有符号|无符号)整数类型。” 例如,如果是典型,最广泛和无符号整数类型得到long long int 和无符号长long int类型,这两者通
..
在线程本地存储 乌尔里希Drepper的论文概述了TLS ABI为几个不同的CPU架构,但我中号发现它不足以作为实施TLS的原因有两个基础: 它省略了许多功能,如ARM,MIPS等重要archs(同时还包括像安腾一堆完全无关的那些的) 更重要的是,它混合了很多与ABI实施细则,使之很难说是必需的互操作性哪些属性,哪些只是他实现的各个方面。 作为一个例子,为i386的唯一实际ABI要
..