如何在一个 Linux x64(例如 Red Hat 7.x)平台上创建一个内部使用 C++ 异常(没有跨越 .so 边界的异常)的基于 C++ 的共享库,使其可以运行在与共享库 ABI 兼容的其他平台上(例如 Red Hat 5.x 或 Red Hat 8.x)?
.so 不使用 C++ 标准库(除了 ),但在内部使用 C++ 异常。它的外部 API 仅为 C,所有异常都在内部捕获(包括使用“catch(...)”以确保安全)。
现在的经验是,尽管在 GLIBC 中进行了版本控制,但使用 GCC 4.7.2 构建并由主程序通过 dlopen 加载的 .so 确实可以在具有 libc.so.6 等的系统上运行 2.12 版,但不能在一个 2.5 版本的系统,在抛出异常时会发生奇怪的 abort() 和 terminate() 调用。
.so 是使用“-fabi-version=2”编译的。在任何平台上都不会发生链接器/加载器错误。
所以我的问题是如何完成构建这样一个可以在旧平台上运行的 .so 的任务?这一定是可能的。
最佳答案
在 Linux 上,g++
将 libstdc++
和 libgcc_s
链接到您的可执行文件和共享库。
我会尝试使用 -static-libgcc
和 -static-libstdc++
将它们静态链接到您的共享库中。然后检查 ldd my.so
输出以确保您的共享库没有链接不需要的 .so
。
关于c++ - 如何在内部使用 C++ 异常并可以在旧平台上运行的 linux x64 上创建共享库对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36455453/