libavcodec.so:有文本重定位

LS_*_*LS_ 46 java android metaio

我在Nexus 5上测试Android 6.0,我正在使用Metaio(我知道该服务将在12月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)
Run Code Online (Sandbox Code Playgroud)

有没有人知道这个或至少一个解决方法的可能解决方案?我很难找到解决方案,但我无法理解问题可能是什么.

chr*_*tin 44

今天,在Nexus 6(Motorola)上使用Android 6.0测试我的应用程序时,我收到了相同的错误消息.我通过检查清单文件中的targetSDKVersion解决了我的问题.使用"22"而非"23"作为targetSDKVersion解决了它.(见下文)

<uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="22" />
Run Code Online (Sandbox Code Playgroud)

我还检查了编译版本和targetSDKversion的build.gradle文件:

compileSdkVersion 22
    buildToolsVersion '22.0.1'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
    }
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你.但是,现在这只是一个短期的解决方法,我希望我们会从metaio获得一些反馈.

此致,克里斯汀

  • @Hiren Dabhi:我认为您必须自己将库(FFMPEG ...)编译为共享对象(-.so),并将有问题的-.so库与您更新的-.so交换.至于我自己,我还没有这样做,我不再使用metaioSDK了.据我所知,仍然可以在GooglePlay上发布带有targetSDKversion = 22的应用程序(Unity应用程序也这样做).但是,如果应用程序已经使用版本23发布,则无法使用targetSDKversion 22. (3认同)

Ani*_*udh 12

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

"libfoo.so有文本重定位.这会浪费内存并防止安全性加剧.请修复."

尽管如此,操作系统仍会加载库.如果您的应用程序的目标SDK版本> = 23,Marshmallow会拒绝库.系统不再记录此因为它假定您的应用程序将记录dlopen(3)故障本身,并包含来自dlerror(3)的文本,它解释了问题.不幸的是,UnsatisfiedLinkError throw by System.loadLibrary在这种情况下,许多应用程序似乎都会捕获并隐藏,通常不会发现库无法加载,直到您尝试调用其中一种本机方法并且VM抱怨它不存在.

您可以使用命令行scanelf工具检查文本重定位.您可以在互联网上找到有关该主题的建议; 例如https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide是一个有用的指南.


ARe*_*ame 12

好的,即使设置了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  
Run Code Online (Sandbox Code Playgroud)

我从https://github.com/FFmpeg/FFmpeg获取最新信息

您还需要在构建中的某个位置声明HAVE_SECTION_DATA_REL_RO,以便在asm.S中使用动态重定位选项.

  • 对于那些完全不同的分支,这里有一个指向ffmpeg修复此问题的确切补丁的链接,[link1](https://github.com/FFmpeg/FFmpeg/commit/f963f80399deb1a2b44c1bac3af7123e8a0c9e46)和[link2](https:/ /github.com/FFmpeg/FFmpeg/commit/cb416a7d795414aaa534c27943bda0d3aef3b5a1) (3认同)
  • @AReallyGoodName我有.so文件,但它们在文件名中有版本号,并且使用其他.so文件中的那些名称引用它们,因此不能只重命名它们.你能告诉我们你如何编译.so文件而不进行版本控制.对所有评论感到抱歉.:) (2认同)

thi*_*olr 12

您可以通过执行以下操作来检查您的共享lbirary是否具有文本重定位:

readelf -a path/to/yourlib.so | grep TEXTREL
Run Code Online (Sandbox Code Playgroud)

如果它有文本重定位,它会显示如下:

0x00000016 (TEXTREL)                    0x0
Run Code Online (Sandbox Code Playgroud)

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

ndk-build -B -j 8
Run Code Online (Sandbox Code Playgroud)

如果再次检查它,grep命令将不返回任何内容.


Ozz*_*zzz 6

经过很长一段时间的努力,并尝试以不同的方式编译FFmpeg,我找到了解决方案.确保使用--disable-asm标志编译FFmpeg.这将确保FFmpeg不会有文本重定位,并且在针对Android M进行编译时不会崩溃(SDK 23)

为了确保它有效,您可以使用如上所述的readelf.

干杯