在32位环境中调用___tls_get_addr是否危险?

时间:2020-09-23 19:41:27

标签: c++ c glibc libstdc++

我们有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是否危险?如果有问题,我们该如何解决?预先感谢。

1 个答案:

答案 0 :(得分:1)

您引用的GCC bug in __tls_get_addr stack alignment特定于x86-64。它在i386上不存在。我假设您在问题中交换了i386和x86-64。

通常,分发工具链是一致且经过良好测试的。如果您使用系统编译器编译程序并使用系统glibc版本,则__tls_get_addr将按预期工作,即使尚未修复GCC错误。仅当错误程序使用恰好使用矢量指令的malloc运行错误程序时,该错误才会出现。对于glibc的malloc,这仅在GCC 7或更高版本中发生。一旦Fedora开始使用GCC 7作为系统编译器,就发现了glibc中GCC错误的不完整解决方法,并且在上游实现了更完整的解决方法(并将其集成到Fedora中)。在GCC 7切换之前,有问题的应用程序运行正常。

Some distributions have backported the fix是因为它们支持多个编译器和malloc实现。最后,这是一个发行版集成问题,因此,如果您有疑问,则需要咨询发行版支持。

___tls_get_addr(三个下划线)仅是内部实现细节。对于glibc 2.20和更早版本的某些调试工具来说,它是可见的,因为它不是隐藏的符号。在glibc 2.21和更高版本中,它已隐藏(在i386上),并且ltrace和类似工具将不再报告它。这只是次要的性能优化,不会影响功能。