如何在linux x64上创建共享库对象,该对象内部使用C++异常,并且可以在旧平台上运行
How to create a shared library object on linux x64 which internally uses C++ exceptions and can run on older platforms?
如何在一个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
。
相关文章:
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 对象初始化后在C++中显示 char 数组时的异常行为
- 如何捕获 C++ 内置异常对象
- 对象接收堆栈溢出异常 c++ 的排序向量
- 堆异常 -1073741510对象
- std::bad_weak_ptr对象构造后shared_from_this异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 基于对象的两个属性的自定义比较器会引发异常
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 为什么内置类型的对象上的溢出会导致异常/未定义的行为?
- 如何防止构造函数在引发异常时创建对象
- std::system 实例化单一实例对象时的异常
- 异常对象的最后一个潜在销毁点
- 初始化引发异常的对象
- 调试器在异常C++时未挂起调试对象
- 通过引用派生类对象从基类对象执行向下转换时引发bad_cast异常
- 在 C++ 中的构造函数中引发异常时销毁对象的成员变量
- C++ 异常处理:将异常定义为对象
- 从函数中抛出内部对象异常合法吗