gpt4 book ai didi

c++ - 由于符号与 abi::cxx11 的链接问题?

转载 作者:IT老高 更新时间:2023-10-28 22:59:39 34 4
gpt4 key购买 nike

我们最近因为 GCC 5.1, libstdc++ and Dual ABI 收到了一份报告.好像Clang is not aware of the GCC inline namespace changes ,因此它基于一组命名空间或符号生成代码,而 GCC 使用另一组命名空间或符号。在链接时,由于缺少符号而出现问题。

如果我正在解析 Dual ABI页面正确,看起来像是在 _GLIBCXX_USE_CXX11_ABIabi::cxx11 上进行旋转的问题,还有一些额外的困难。更多阅读请访问 Red Hat 的博客 GCC5 and the C++11 ABIThe Case of GCC-5.1 and the Two C++ ABIs .

以下来自 Ubuntu 15 机器。 native 提供GCC 5.2.1。

$ cat test.cxx
#include <string>

std::string foo __attribute__ ((visibility ("default")));
std::string bar __attribute__ ((visibility ("default")));

$ g++ -g3 -O2 -shared test.cxx -o test.so

$ nm test.so | grep _Z3
...
0000201c B _Z3barB5cxx11
00002034 B _Z3fooB5cxx11

$ echo _Z3fooB5cxx11 _Z3barB5cxx11 | c++filt
foo[abi:cxx11] bar[abi:cxx11]

如何使用两种装饰生成带有符号的二进制文件(Red Hat 博客称之为“共存”)?

或者,我们有哪些选择?


我正在努力为用户实现“它只是工作”。我不在乎是否有两个具有两种不同行为的弱符号(std::string 缺少写时复制,而 std::string[abi:cxx11] 提供写时复制)。或者,一个可以是另一个的别名。

Debian 在 Debian Bug report logs: Bugs tagged libstdc++-cxx11 上有大量类似的错误。 .他们的解决方案是在新的 ABI 下重建所有内容,但它没有处理混合/匹配编译器以 ABI 更改为模的极端情况。

在 Apple 世界中,我认为这接近于一个胖二进制文件。但我不确定在 Linux/GCC 世界中该做什么。最后,我们不控制发行版如何构建库,也不控制使用哪些编译器将应用程序与库链接。

最佳答案

免责声明,以下内容未经生产测试,使用风险自负。

您可以自己在双 ABI 下发布您的库。这或多或少类似于 OSX “胖二进制”,但完全使用 C++ 构建。

最简单的方法是编译库两次:分别使用 -D_GLIBCXX_USE_CXX11_ABI=0-D_GLIBCXX_USE_CXX11_ABI=1。根据宏的值将整个库放在两个不同的命名空间下:

#if _GLIBCXX_USE_CXX11_ABI
# define DUAL_ABI cxx11 __attribute__((abi_tag("cxx11")))
#else
# define DUAL_ABI cxx03
#endif

namespace CryptoPP {
inline namespace DUAL_ABI {
// library goes here
}
}

现在您的用户可以像往常一样使用 CryptoPP::whatever,这映射到 CryptoPP::cxx11::whateverCryptoPP::cxx03::任何取决于所选的 ABI。

注意,GCC 手册说此方法将更改标记的内联命名空间中定义的所有内容的重命名。根据我的经验,这不会发生。

如果 _GLIBCXX_USE_CXX11_ABI 不为零,则另一种方法是使用 __attribute__((abi_tag("cxx11"))) 标记每个类、函数和变量。这个属性很好地将 [cxx11] 添加到 demangler 的输出中。我认为使用命名空间同样有效,并且需要对现有代码进行较少的修改。

理论上你不需要复制整个库,只需要复制使用 std::stringstd::list 的函数和类,以及函数和类使用这些函数和类,以此类推。但在实践中,这可能不值得付出努力,尤其是在库不是很大的情况下。

关于c++ - 由于符号与 abi::cxx11 的链接问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36159238/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com