gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:51 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

你不应该这样做。

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

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

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

关于c++ - 使用静态 glibc 编译共享对象 (.so),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42764747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com