java - libavcodec.so: tiene reubicaciones de texto
android metaio (6)
Estoy probando Android 6.0 en un Nexus 5 y estoy usando Metaio (sé que el servicio finalizará el 15 de diciembre, pero para esa fecha nos trasladaremos a otra plataforma AR). El problema es que cuando inicio la ARActivity obtengo el siguiente error:
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)
¿Alguien sabe una posible solución para esto o al menos una solución? Estoy luchando por encontrar una solución, pero no puedo entender cuál podría ser el problema.
Después de mucho tiempo luchando e intentando compilar FFmpeg de diferentes maneras, encontré la solución. Asegúrese de compilar FFmpeg con el indicador --disable-asm. Esto asegurará que FFmpeg no tenga reubicaciones de texto y no se bloqueará al compilar contra Android M (SDK 23)
Para asegurarse de que funcionó, puede usar readelf como se mencionó anteriormente.
Aclamaciones
Hoy recibí los mismos mensajes de error al probar mi aplicación con Android 6.0 en un Nexus 6 (Motorola). Resolví mi problema comprobando la targetSDKVersion en el archivo de manifiesto. Usando "22" y no "23" como targetSDKVersion lo resolvió. (Vea abajo)
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="22" />
También verifiqué los archivos build.gradle para la versión de compilación y targetSDKversion:
compileSdkVersion 22
buildToolsVersion ''22.0.1''
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
}
Espero que esto te ayudará. Sin embargo, esta es solo una solución a corto plazo por ahora, aunque espero que recibamos algunos comentarios de metaio.
Saludos, christin
Las versiones anteriores de Android advertirían si se le solicita cargar una biblioteca compartida con reubicaciones de texto:
"libfoo.so tiene reubicaciones de texto. Esto está desperdiciando memoria y evita el endurecimiento de la seguridad. Arregle".
A pesar de esto, el sistema operativo cargará la biblioteca de todos modos.
Marshmallow rechaza la biblioteca si la versión del SDK de destino de su aplicación es> = 23. El sistema ya no registra esto porque supone que su aplicación registrará el error dlopen (3) e incluirá el texto de dlerror (3) que explica el problema.
Desafortunadamente, muchas aplicaciones parecen detectar y ocultar el
UnsatisfiedLinkError throw by System.loadLibrary
en este caso, a menudo sin dejar idea de que la biblioteca no pudo cargarse hasta que intentas invocar uno de tus métodos nativos y la VM se queja de que no está presente.
Puede usar la herramienta scanelf de línea de comandos para verificar las reubicaciones de texto. Puede encontrar consejos sobre el tema en Internet; por ejemplo https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide es una guía útil.
OK, tengo esto trabajando aquí incluso con targetSDK 23 configurado.
Para mí y mi sucursal, los cinco archivos que requerían parches eran
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
Tomé lo último de https://github.com/FFmpeg/FFmpeg
También necesitará HAVE_SECTION_DATA_REL_RO declarado en algún lugar de su compilación para que la macro en asm.S use la opción de reubicaciones dinámicas.
Puede verificar si su lbirary compartido tiene reubicaciones de texto haciendo esto:
readelf -a path/to/yourlib.so | grep TEXTREL
Si tiene reubicaciones de texto, le mostrará algo como esto:
0x00000016 (TEXTREL) 0x0
Si este es el caso, puede volver a compilar su biblioteca compartida con la última versión de NDK disponible:
ndk-build -B -j 8
Y si vuelve a comprobarlo, el comando grep no devolverá nada.
Recibí comentarios del equipo SDK de metaio. Dicen que este problema no se puede resolver fácilmente con metaio, ya que está relacionado con la biblioteca FFMpeg. Tendríamos que esperar que una actualización de FFMpeg solucionara el problema. Supongo que tenemos que esperar dicha actualización e intercambiar los archivos de la biblioteca en la aplicación.
Todavía no he buscado un foro de contacto de desarrolladores de FFMpeg para realizar consultas o notificar un error. ¿Conoces uno por accidente?
Mejores regrados, christin