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

Eri*_*ara 5 c c++ gcc glibc static-compilation

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

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

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

编辑:可能不是动态链接libc静态和其他库GCC重复,重新访问?因为这个问题谈论静态链接libc的主要精灵,这是关于静态链接libc的共享对象.

Joh*_*nck 8

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

你不应该这样做.

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

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

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

  • 静态链接glibc还有可能运行与底层运行时内核的系统调用接口不匹配的glibc版本. (2认同)