Подтвердить что ты не робот

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)

Кто-нибудь знает возможное решение для этого или, по крайней мере, обходного пути? Я изо всех сил пытаюсь найти решение, но я не могу понять, в чем проблема.

4b9b3361

Ответ 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.

С уважением, Christin

Ответ 2

OK У меня это работает даже с установленным 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  

Я взял последнюю версию https://github.com/FFmpeg/FFmpeg

Вам также понадобится HAVE_SECTION_DATA_REL_RO, объявленный где-то в вашей сборке для макроса в asm.S, чтобы использовать параметр динамических перемещений.

Ответ 3

Предыдущие версии Android предупреждали, если их попросят загрузить общую библиотеку с перемещением текста:

"libfoo.so имеет перестановки текста. Это тратит впустую память и предотвращает защитное упрочнение. Пожалуйста, исправьте.".

Несмотря на это, ОС будет загружать библиотеку в любом случае. Marshmallow отклоняет библиотеку, если целевая версия SDK для целевой программы >= 23. Система больше не регистрирует это, потому что предполагает, что ваше приложение будет регистрировать сам отказ dlopen (3) и включить текст из dlerror (3), который объясняет проблему. К сожалению, многие приложения, похоже, поймают и скроют UnsatisfiedLinkError throw by System.loadLibrary в этом случае, не оставляя никаких подсказок, что библиотека не загрузилась, пока вы не попытаетесь вызвать один из ваших собственных методов, и VM жалуется, что она не присутствует.

Вы можете использовать инструмент командной строки командной строки для проверки перемещения текста. Вы можете найти советы по этому вопросу в Интернете; например https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide является полезным руководством.

Ответ 4

Вы можете проверить, имеет ли ваш общий lbirary текстовые перемещения, делая это:

readelf -a path/to/yourlib.so | grep TEXTREL

Если у него есть перестановки текста, он покажет вам что-то вроде этого:

0x00000016 (TEXTREL)                    0x0

Если это так, вы можете перекомпилировать свою общую библиотеку с последней версией NDK:

ndk-build -B -j 8

И если вы проверите его снова, команда grep ничего не вернет.

Ответ 5

После долгого времени, пытаясь скомпилировать FFmpeg по-разному, я нашел решение. Обязательно скомпилируйте FFmpeg с флагом --disable-asm. Это позволит убедиться, что FFmpeg не будет иметь текстовые перестановки и не будет сбой при компиляции в Android M (SDK 23)

Чтобы убедиться, что это сработало, вы можете использовать readelf, как указано выше.

Приветствия

Ответ 6

Я получил обратную связь от команды metaio SDK. Говорят, что эта проблема не может быть легко решена метаио, поскольку она связана с библиотекой FFMpeg. Мы должны надеяться, что обновление FFMpeg устранит проблему. Я предполагаю, что мы должны ждать такого обновления и обмениваться библиотечными файлами в приложении.

Я еще не искал форум для общения с разработчиками FFMpeg, чтобы делать запросы или уведомлять об ошибке. Вы знаете его случайно?

Лучшие редки, крестин