为什么LTO在armv8a NDK构建中引入了新的DT标志TLSDESC_PLT和TLSDESC_GOT

8
我正在使用NDK构建一个armv8a Android SDK,并希望启用LTO构建。我将 -flto 添加到C ++工具链的编译和链接标志中,一切都进行得很顺利,直到我尝试在模拟器中运行时,就会发出以下类似的错误:

警告:链接器:/ data / lib / libservice.so:未使用的DT条目:类型0x6ffffef6 arg 0x8e30

警告:链接器:/ data / lib / libservice.so:未使用的DT条目:类型0x6ffffef7 arg 0x2fb50

一些研究使我找到了此答案,它允许我挖掘出 0x6ffffef6 和 0x6ffffef6 的符号名称,它们碰巧是分别为 TLSDESC_PLT 和 TLSDESC_GOT ,因此显然与动态链接器、PLT/GOT以及TLS有关。好的。

将非LTO构建与LTO构建进行比较,这些标志明确仅用于LTO构建:

$ readelf-a / lto / lib / libservice.so | grep TLS   L(链接顺序),O(需要额外的OS处理),G(组),T(TLS),   TLS 0x000000000001ed70 0x000000000002ed70 0x000000000002ed70  0x000000006ffffef6(TLSDESC_PLT)0x8e30  0x000000006ffffef7(TLSDESC_GOT)0x2fb50 00000002ffd8 000000000407 R_AARCH64_TLSDESC 0 00000002ffe8 000000000407 R_AARCH64_TLSDESC 8    579:0000000000000008 8个TLS LOCAL DEFAULT 17 _ZN5xxxxx12_GLOBAL__N_113    788:0000000000000000 1个TLS LOCAL DEFAULT 17 __tls_guard $

$ readelf-a / nolto / lib / libservice.so | grep TLS   L(链接顺序),O(需要额外的OS处理),G(组),T(TLS), $

所以,有一些问题:

  • 为什么 Android armv8a 运行时会拒绝这些 DT 标志?
  • 为什么启用 LTO 似乎会改变 TLS 的实现或需求?为什么这些标签会被发出(连同其他符号一起)?
  • 我该如何防止这种情况,或以其他方式避免此问题?我可以请求其他 TLS 模型吗?
  • 我已经发现至少还有一个类似的问题,Android 环境拒绝了通常需要 DT_ORIGIN 处理的标志 DT_ORIGIN,但仍然支持未设置 DT_ORIGIN$ORIGIN。拒绝 TLDESC_ 标志是否潜在地是一个过于严格的检查,代码实际上没问题,这将表明存在 NDK bug?

非常感谢您的任何见解。请注意,对其他 Android 目标似乎也适用,特别是 Android x86_64 构建可以很好地使用 -flto,并且生成的二进制文件在 readelf -a 输出中没有任何 TLSDESC

1个回答

0

我升级到了NDK r18 beta2,现在我不再有这个问题。看起来潜在的问题与没有将模拟TLS的使用传播到gold链接器插件中有关(请参见https://github.com/android-ndk/ndk/issues/498),这个问题在r18中已经得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接