如何在linux x64上创建共享库对象,该对象内部使用C++异常,并且可以在旧平台上运行

How to create a shared library object on linux x64 which internally uses C++ exceptions and can run on older platforms?

本文关键字:对象 异常 C++ 运行 平台 x64 linux 创建 共享 内部      更新时间:2023-10-16

如何在一个Linux x64(如Red Hat 7.x)平台上创建一个基于C++的共享库,该库内部使用C++异常(没有跨越.so边界的异常),并以可以在与共享库兼容的ABI的其他平台(如Red Hat5.x或Red Hat 8.x)上运行的方式创建?

.so不使用C++标准库(除了),但在内部使用C++异常。它的外部API仅为C,所有异常都在内部捕获(包括为了安全起见使用"catch(…)")。

现在的经验是,尽管使用GCC 4.7.2构建并由主程序通过dlopen加载的GLIBC a.so在版本为2.12的libc.so.6等系统上运行,但在版本为2.5的系统上却没有运行,在抛出异常时会发生奇怪的abort()和terminate()调用。

.so是用"-fabiversion=2"编译的。任何平台上都不会出现链接器/加载程序错误。

所以我的问题是,如何实现构建这样一个.那么哪个可以在旧平台上运行呢?这一定是可能的。

在Linux上,libstdc++libgcc_s中的g++链接到您的可执行文件和共享库。

我会尝试使用-static-libgcc-static-libstdc++将它们静态地链接到您的共享库中。然后检查ldd my.so的输出,以确保您的共享库没有链接不需要的.so