仅在Android NDK aarch64内部版本中“符号表的全局部分中的本地符号'__bss_start'”

时间:2019-03-06 03:03:10

标签: android android-ndk arm64

我正在使用NDK(r19b)为armaarch64x86x86_64创建一个Android库。一切正常,除了在构建aarch64体系结构应用程序时,会收到以下错误消息。

ld.lld: error: found local symbol '_edata' in global part of symbol table in file libmystuff.so
ld.lld: error: found local symbol '_end' in global part of symbol table in file libmystuff.so
ld.lld: error: found local symbol '__bss_start' in global part of symbol table in file libmystuff.so

当我使用readelf -s libmystuff.so检查每个构建变体时,我发现只有aarch64是不同的。

[arm]
    4021: 007a30f0     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    4022: 007c6b10     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    4023: 007a30f0     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start

[x86]
    3848: 00c82c88     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    3849: 00ca4b28     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    3850: 00c82c88     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start

[x86_64]
    3874: 0000000000c9b890     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    3875: 0000000000ce5f68     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    3876: 0000000000c9b890     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start

[aarch64]
       3: 0000000000b4f168     0 NOTYPE  LOCAL  DEFAULT  ABS _edata
       4: 0000000000b990e8     0 NOTYPE  LOCAL  DEFAULT  ABS _end
       5: 0000000000b4f168     0 NOTYPE  LOCAL  DEFAULT  ABS __bss_start

     865: 0000000000b9e3e8     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    2468: 0000000000b54168     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__

我可以肯定地看到_edata_end__bss_start位于LOCAL而不是GLOBAL,但是我什么也不做(或者至少我认为我没有做) aarch64特别;它们都使用相同的构建配置。

jni/Application.mk
    NDK_TOOLCHAIN_VERSION := clang
    APP_STL := c++_static
    APP_CFLAGS := -fstack-protector-all -fvisibility=hidden -ffunction-sections -fdata-sections
    APP_CPPFLAGS := -fstack-protector-all -std=c++11 -fvisibility=hidden -ffunction-sections -fdata-sections -frtti
    APP_LDFLAGS := -Wl,--gc-sections,-fvisibility=hidden,--strip-debug

那么,aarch64为什么与众不同?更好的是,如何将它们转移到GLOBAL?

[更新] 感谢https://github.com/android-ndk/ndk/issues/927的好朋友,我发现解决方案最有效;在末尾注意“ -fuse-ld = lld”。

APP_LDFLAGS := -Wl,--gc-sections,--strip-debug -fvisibility=hidden -fuse-ld=lld

这样,我仍然可以保留--gc-sections,而--no-fatal-warnings也没有必要。

1 个答案:

答案 0 :(得分:2)

  

APP_LDFLAGS := -Wl,-fvisibility=hidden

这有什么作用吗?此选项没有出现在bfd的帮助页面中,但是那些符号是由链接器发出的,所以我想知道这是什么引起的。

如果失败,请尝试在您的{{1中添加-fuse-ld=gold(如果您喜欢冒险,可以添加-fuse-ld=lld,但是如果需要,可以添加许多Windows KI,如果需要的话) }}。 arm64与NDK中其他体系结构之间的最大区别是,我们仍将bfd用于arm64。

由于这些是链接程序发出的符号,因此这似乎是最可能的罪魁祸首。