-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
。