使用静态glibc

时间:2017-03-13 13:22:38

标签: c++ c gcc glibc static-compilation

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

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

使用-shared和-static进行编译并不起作用,因为crtbeginT.o没有用-fPIC编译。

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

1 个答案:

答案 0 :(得分:7)

您希望在共享库中静态链接glibc。

你不应该这样做。

如果您尝试,最终将导致C ++ One Definition Rule(ODR)违规。这是因为glibc的某些部分将来自" old"目标机器的版本,有些将来自" new"你的图书馆的版本。结果是未定义的行为。

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

特别关于memcpy,请参阅:https://stackoverflow.com/a/8823419/4323 - 以及手动修复:https://stackoverflow.com/a/5977518/4323