Я создаю библиотеку Android с NDK (r19b) для arm
, aarch64
, x86
и x86_64
.Все в порядке, за исключением того, что когда я собираю приложение для архитектуры 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
находятся в МЕСТНОМ, а не ГЛОБАЛЬНОМ, но я не (или, по крайней мере, я думаю, что неt) сделать что-то особенное для 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
также не требуется.