libavcodec.so: имеет перемещения текста
Я тестирую Android 6.0 на Nexus 5 и использую Metaio (я знаю, что служба завершится 15 декабря, но на эту дату мы перейдем на другую AR-платформу). Проблема в том, что когда я запускаю ARActivity, я получаю следующую ошибку:
09-02 08:45:11.138: E/AndroidRuntime(6141): java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.myapp.myapp/lib/arm/libavcodec.so: has text relocations
09-02 08:45:11.138: E/AndroidRuntime(6141): at java.lang.Runtime.loadLibrary(Runtime.java:372)
09-02 08:45:11.138: E/AndroidRuntime(6141): at java.lang.System.loadLibrary(System.java:1076)
09-02 08:45:11.138: E/AndroidRuntime(6141): at com.metaio.sdk.jni.IMetaioSDKAndroid.loadNativeLibs(IMetaioSDKAndroid.java:54)
09-02 08:45:11.138: E/AndroidRuntime(6141): at metaioCloudPlugin.SplashActivity.loadNativeLibs(SplashActivity.java:37)
09-02 08:45:11.138: E/AndroidRuntime(6141): at metaioCloudPlugin.SplashActivity.onCreate(SplashActivity.java:68)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.Activity.performCreate(Activity.java:6237)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.-wrap11(ActivityThread.java)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.os.Handler.dispatchMessage(Handler.java:102)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.os.Looper.loop(Looper.java:148)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.main(ActivityThread.java:5417)
09-02 08:45:11.138: E/AndroidRuntime(6141): at java.lang.reflect.Method.invoke(Native Method)
09-02 08:45:11.138: E/AndroidRuntime(6141): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
09-02 08:45:11.138: E/AndroidRuntime(6141): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Кто-нибудь знает возможное решение для этого или хотя бы обходной путь?
Я изо всех сил пытаюсь найти решение, но я не могу понять, в чем может быть проблема.
Переведено автоматически
Ответ 1
Сегодня я получил те же сообщения об ошибках при тестировании моего приложения с Android 6.0 на Nexus 6 (Motorola). Я решил свою проблему, проверив targetSdkVersion в файле манифеста. Использование "22", а не "23" в качестве targetSdkVersion решило проблему. (См. Ниже)
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="22" />
Я также проверил файлы build.gradle на наличие версии компиляции и targetSdkVersion:
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
}
Надеюсь, это поможет вам. Однако на данный момент это всего лишь краткосрочное решение, хотя я надеюсь, что мы получим некоторую обратную связь от metaio.
С уважением, Кристин
Ответ 2
Вы можете проверить, есть ли в вашей общей библиотеке перемещения текста, выполнив это:
readelf -a path/to/yourlib.so | grep TEXTREL
Если в нем есть перемещения текста, он покажет вам что-то вроде этого:
0x00000016 (TEXTREL) 0x0
В этом случае вы можете перекомпилировать свою общую библиотеку с помощью последней доступной версии NDK:
ndk-build -B -j 8
И если вы проверите это снова, команда grep ничего не вернет.
Ответ 3
Предыдущие версии Android выдавали предупреждение, если их просили загрузить общую библиотеку с перемещением текста:
"libfoo.так же как и перемещения текста. Это приводит к пустой трате памяти и предотвращает усиление безопасности. Пожалуйста, исправьте. ".
Несмотря на это, операционная система все равно загрузит библиотеку. Marshmallow отклоняет библиотеку, если целевая версия SDK вашего приложения >= 23. Система больше не регистрирует это, поскольку предполагает, что ваше приложение само зарегистрирует сбой dlopen (3) и включит текст из dlerror (3), который объясняет проблему. К сожалению, многие приложения, похоже, перехватывают и скрывают UnsatisfiedLinkError throw by System.loadLibrary
в этом случае, часто не оставляя никаких сведений о том, что библиотеке не удалось загрузиться, пока вы не попытаетесь вызвать один из ваших собственных методов, и виртуальная машина не пожалуется, что его нет.
Вы можете использовать инструмент scanelf командной строки для проверки перемещений текста. Вы можете найти рекомендации по этому вопросу в Интернете; например, https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide это полезное руководство.
Ответ 4
Хорошо, у меня это работает даже с установленным targetSdk 23.
Для меня и моей ветки пятью файлами, которые требовали исправления, были
libavcodec\arm\fft_fixed_neon.S
libavcodec\arm\fft_neon.S
libavcodec\arm\fft_vfp.S
libavcodec\arm\mlpdsp_armv5te.S
libutil\arm\asm.S
I took the latest from https://github.com/FFmpeg/FFmpeg
You will also need HAVE_SECTION_DATA_REL_RO declared somewhere in your build for the macro in asm.S to use the dynamic relocations option.