使用静态 glibc 编译共享对象 (.so)

Compile a shared object (.so) with static glibc

我正在构建一些需要成为共享对象 (.so) 的代码。

我构建机器上的 libc 可能比发布的机器更新的问题,所以我想 link 静态地使用它以避免兼容性问题。 (我的程序使用 memcpy,当它可以低至 2.5 时,它显然是 GLIBC_2.14 的东西)。

无法同时使用 -shared 和 -static 进行编译,因为 crtbeginT.o 未使用 -fPIC 进行编译。

编辑:可能不是 GCC linking libc static and some other library dynamically, revisited? 的重复,因为那个问题是关于静态 linking libc 的主要精灵,而这是关于静态 linking libc 的共享对象。

您想在共享库中静态 link glibc。

你不应该这样做。

如果您尝试,最终将违反 C++ 统一定义规则 (ODR)。这是因为 glibc 的某些部分将来自目标机器的 "old" 版本,而某些部分将来自库的 "new" 版本。结果是未定义的行为。

正确的解决方案很简单:使用较旧的 glibc 构建(与最旧的部署目标一样旧)。或构建多次,针对您需要的每个 glibc 版本构建一次(如果您确实需要新的 glibc 功能)。即使您认为您需要一个新的 glibc 功能,也可以考虑以不同的名称将该功能复制粘贴到您的库中以避免冲突。

特别是关于 memcpy,请参阅: - and for a manual fix: