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

acm*_*acm 8 linker android arm elf android-ndk

我正在使用NDK为Android构建armv8a SDK,我想在启用LTO的情况下构建.我添加-flto到C++工具链的编译和链接标志,一切顺利,直到我试图在模拟器中运行,此时发出如下错误:

WARNING: linker: /data/lib/libservice.so: unused DT entry: type 0x6ffffef6 arg 0x8e30

WARNING: linker: /data/lib/libservice.so: unused DT entry: type 0x6ffffef7 arg 0x2fb50

一些研究让我得到了这个答案,这个答案让我能够挖出符号名称,0x6ffffef6并且0x6ffffef6它们分别恰好TLSDESC_PLTTLSDESC_GOT动态链接器和PLT/GOT以及TLS有关.精细.

将非LTO构建与LTO构建进行比较,这些标志肯定只适用于LTO构建:

$ readelf -a /lto/lib/libservice.so | grep TLS L (link order), O (extra OS processing required), G (group), 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 (link order), O (extra OS processing required), G (group), T (TLS), $

所以,有些问题:

  • 为什么android armv8a运行时拒绝这些DT标志?
  • 为什么启用LTO似乎会改变TLS实施或需求?为什么会发出这些标签(以及其他符号)?
  • 我该如何防止这种情况,或以其他方式避免这个问题?我可以要求其他一些TLS模型吗?
  • 我至少发现了一个像这样的问题,其中Android环境拒绝了处理时DT_ORIGIN通常需要的标志$ORIGIN,但$ORIGIN即使没有DT_ORIGIN设置也仍然很荣幸.拒绝TLDESC_标志可能是一个类似的过于热心的检查,而且代码实际上很好,这表明NDK错误?

任何见解都表示赞赏.请注意,这似乎适用于其他Android目标,特别是Android x86_64构建工作正常-flto,并且生成的二进制文件TLSDESCreadelf -a输出中没有任何内容.

acm*_*acm 0

我升级到NDK r18 beta2,不再有这个问题。看来潜在的错误与不通过黄金链接器插件向下传播模拟 TLS 的使用有关(请参阅https://github.com/android-ndk/ndk/issues/498),该错误已在 r18 中修复。