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_PLT和TLSDESC_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),
$
所以,有些问题:
DT_ORIGIN通常需要的标志$ORIGIN,但$ORIGIN即使没有DT_ORIGIN设置也仍然很荣幸.拒绝TLDESC_标志可能是一个类似的过于热心的检查,而且代码实际上很好,这表明NDK错误?任何见解都表示赞赏.请注意,这似乎适用于其他Android目标,特别是Android x86_64构建工作正常-flto,并且生成的二进制文件TLSDESC在readelf -a输出中没有任何内容.
我升级到NDK r18 beta2,不再有这个问题。看来潜在的错误与不通过黄金链接器插件向下传播模拟 TLS 的使用有关(请参阅https://github.com/android-ndk/ndk/issues/498),该错误已在 r18 中修复。