【发布时间】:2020-09-23 19:41:27
【问题描述】:
我们有 x86_64 系统,但所有库和应用程序都是为 i386 构建的,我们在 i386 模式下运行它们。 gdb(还有 ltrace)告诉我们,使用了 ___tls_get_addr,据我所知,它是为 x86_64 设计的(___tls_get_addr gnu),而且我们还有 glibc 版本 2.19-18(看起来问题仅在 glibc- 2.24)。从以 i386 模式运行的应用程序调用 ___tls_get_addr 是否危险?如果这是一个问题,我们如何解决这个问题?提前致谢。
【问题讨论】:
-
作为一般的经验法则,对于 C++ 程序,应用程序的所有部分,包括它所链接的库,都应该使用相同构建i> 相同架构的精确编译器。否则,无法保证行为正确。
-
@JesperJuhl 看起来我们有 x86_64 系统,它构建 i386 包,glibc 版本 2.23 构建了 gcc 5.4,我们有 2.19 构建了 4.8.4...
-
好的,然后在相同的架构上使用相同的编译器重新编译你的东西。问题解决了。
-
@JesperJuhl 这可能是个好主意,但不能简单地实现。操作系统差异的原因。好吧,谢谢你的意见,无论如何我们都会尝试。
-
您可以将开发人员版本的编译器反向移植到运行相同的旧操作系统,例如,我们最近必须获得 gcc 的开发版本才能在 redhad 6(旧版)上构建我们的软件因为redhat 6上的默认编译器不支持我们使用的一些特性