libavcodec.so:有文本重定位

我在Nexus 5上testingAndroid 6.0,并且使用Metaio(我知道该服务将在十二月十五号结束,但那个时候我们将移动到另一个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) 

有没有人知道一个可能的解决scheme,或至less一个解决方法? 我正在努力寻找一个解决scheme,但我不明白这个问题可能是什么。

今天,在Nexus 6(Motorola)上使用Android 6.0testing我的应用时,我得到了相同的错误消息。 我通过检查清单文件中的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得到一些反馈。

问候,克里斯汀

好的,我已经在这里工作,即使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采取了最新的;

您还需要在您的构build中为asm.S中的macros声明HAVE_SECTION_DATA_REL_RO以使用dynamic重定位选项。

如果要求使用文本重定位加载共享库,以前的Android版本会发出警告:

“libfoo.so文本重定位,这是浪费内存,并防止安全加固,请修复。”

尽pipe如此,操作系统将无论如何将加载图书馆。 如果您的应用程序的目标SDK版本> = 23,则棉花糖会拒绝库。系统不会再logging此事件,因为它假定您的应用程序本身会loggingdlopen(3)失败,并包含解释问题的dlerror(3)中的文本。 不幸的是,在这种情况下,很多应用程序似乎都会捕获并隐藏UnsatisfiedLinkError throw by System.loadLibraryUnsatisfiedLinkError throw by System.loadLibrary ,通常不会知道UnsatisfiedLinkError throw by System.loadLibrary库无法载入,直到您尝试调用其中一个本机方法,并且VM抱怨它不存在。

您可以使用命令行scanelf工具来检查文本重定位。 你可以在网上find关于这个主题的build议。 例如https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide是一个有用的指南。;

你可以检查你的共享lbirary是否有文本重定位:

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

如果它有文本重定位,它会告诉你这样的事情:

 0x00000016 (TEXTREL) 0x0 

如果是这种情况,您可以使用最新的NDK版本重新编译共享库:

 ndk-build -B -j 8 

如果你再次检查,grep命令将不会返回任何内容。

经过很长时间的努力,试图以不同的方式编译FFmpeg,我find了解决办法。 确保使用–disable-asm标志编译FFmpeg。 这将确保FFmpeg不会有文本重定位,并且在针对Android M编译时不会崩溃(SDK 23)

为了确保它的工作,你可以使用上面提到的readelf。

干杯

我收到了metaio的SDK团队的反馈。 他们说,这个问题不能通过metaio来解决,因为它与FFMpeg库有关。 我们不得不希望更新FFMpeg能够解决这个问题。 我认为我们必须等待这样的更新,并在应用程序中交换库文件。

我还没有find一个FFMpeg开发人员联系论坛进行查询或通知一个错误。 你知道一个意外吗?

最好的regrads,克里斯汀