7

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

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

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

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

4

1 回答 1

8

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

你不应该这样做。

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

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

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

于 2017-03-13T14:40:36.533 回答