«локальный символ« __bss_start »в глобальной части таблицы символов» только в Android NDK aarch64 build - PullRequest
1 голос
/ 06 марта 2019

Я создаю библиотеку 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 также не требуется.

1 Ответ

2 голосов
/ 06 марта 2019

APP_LDFLAGS := -Wl,-fvisibility=hidden

Это что-нибудь делает?Эта опция не отображается на странице справки для bfd, но эти символы генерируются компоновщиком, поэтому мне интересно, не в этом ли причина этого.

Если это не удалось, попробуйте добавить -fuse-ld=gold (или -fuse-ld=lld если вы чувствуете себя авантюрным, но есть ряд Windows KI с этим, если это то, что вам нужно поддерживать) к вашему APP_LDFLAGS.Самое большое различие между arm64 и другими архитектурами в NDK заключается в том, что мы все еще используем bfd для arm64.

Поскольку эти символы испускаются компоновщиком, это кажется наиболее вероятным виновником.

...