Параметры CMakeLists.txt «-Wl, - whole-archive» вызывают ошибку SIGABRT на Samsung Galaxy Note2, S3 (Kitkat 4.4.2) - PullRequest
0 голосов
/ 07 ноября 2019

Если добавить -Wl,--allow-multiple-definition -Wl,--whole-archive опции в CMakeLists.txt. System.loadLibrary("~"); всегда вызывает ошибку SIGABRT. Ошибка: A/libc: Fatal signal 6 (SIGABRT) at 0x000036ae (code=-6), thread 13998

Я обнаружил, что эти сбои возникают на Galaxy Note 2, Galaxy s3 (Exynos 4 Quad 4412, ARM Cortex-A9 CPU, Android 4.4.2 Kitkat)

Создание новогопроект, используя Android Studio, шаблон проекта "Native C ++" и добавьте один строчный код ниже на CmakeLists.txt.

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--allow-multiple-definition -Wl,--whole-archive")

Он всегда падает на System.loadLibrary("~"); строке.

Репозиторий кода на основе "Собственный шаблон C ++ ": https://github.com/kujyp/AndroidNativeWholeArchiveCrash

Версия NDK: 14.1.3816874

cat ~/Library/Android/sdk/ndk-bundle/source.properties
> Pkg.Desc = Android NDK
> Pkg.Revision = 14.1.3816874

При изменении версии ndk на 20 (20.1.5948944) возникает другая ошибка. Ошибка: java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libc++_shared.so" needed by "libnative-lib.so"; caused by library "libc++_shared.so" not foundРешено (но все еще вылетает в Galaxy Note 2): https://github.com/kujyp/AndroidNativeWholeArchiveCrash/commit/479c15918241e5c68621f27b22c1d56c6c9906ceЕсть какие-нибудь подсказки по причине? Или решение?

Фон:https://gist.github.com/kujyp/9c4c8c63cfd12f797639874d151b1707#file-with_tf1-4_cmakelists-txt

В моем проекте в качестве зависимости используется tenorflow-core.a (v1.4.0). Таким образом, без --allow-multiple-definition или --whole-archive библиотека tenorflow вызывает некоторые ошибки сборки. Так что мои параметры компилятора, параметры компоновщика такие же, как и в хранилище тензорного потока. опции: https://github.com/tensorflow/tensorflow/blob/v1.4.0/tensorflow/contrib/android/cmake/CMakeLists.txt#L45-L48
проблема с --whole-archive опция: https://github.com/tensorflow/tensorflow/issues/4242

С библиотекой тензорного потока следует использовать gcc, а не clang в качестве инструмента сборки. С ndk 15 gcc устарела. (Начиная с tf1.13.1, clang использовался в качестве инструмента для сборки, но в моем проекте используется тензор потока 1.4.0 или 1.5.1 или 1.12.0)Версия NDK для тензорного потока: https://github.com/tensorflow/tensorflow/blob/v1.4.0/tensorflow/tools/ci_build/Dockerfile.android#L44

1 Ответ

0 голосов
/ 09 ноября 2019

-Wl,--whole-archive не должны добавляться к флагам компоновщика без причины. Даже нативные коды ничего не делали, флаг -Wl,--whole-archive вызывал сбои на определенных (древних) устройствах.

Присоединение -Wl,--whole-archive к отдельной библиотеке и -Wl,--no-whole-archive к другим библиотекам устраняет эту ошибку.

Решено CMakeLists.txt: https://gist.github.com/kujyp/9c4c8c63cfd12f797639874d151b1707#file-resolved_tf1-4_cmakelists-txt-L35-L37

Благодаря @ DanAlbert

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...