【问题标题】:libavcodec.so: has text relocationslibavcodec.so:有文本重定位
【发布时间】:2015-09-02 06:54:52
【问题描述】:

我正在 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)

有没有人知道可能的解决方案或至少一种解决方法? 我正在努力寻找解决方案,但我无法理解问题可能是什么。

【问题讨论】:

  • 我遇到了与 NDK 版本 r8B 相同的问题。生成的 .so 文件包含 TEXTREL 部分。但是使用 NDK r8D,我得到了没有 TEXTREL 的 .so lib。您可以使用以下命令检查您的库:android-ndk-r8d\toolchains\arm-linux-androideabi-4.7\prebuilt\windows\bin\arm-linux-androideabi-readelf.exe -a libhcsample.so | grep TEXTREL

标签: java android metaio


【解决方案1】:

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

问候, 克里斯汀

【讨论】:

  • 是的,我在 iPad mini 1 上试用了 iOS 9。我的 AREL 应用程序按预期运行。我还尝试了一些我的 junaio 频道。到目前为止没有问题。我测试了 Glue、LB/GPS、GPS/方向跟踪、即时跟踪、扩展图像跟踪、虚拟跟踪等跟踪。像 setTexture(); 这样的方法startAnimation() + 其他动画处理方法,shareScreenshot()、startMovieTexture() 正在工作。也开始全屏电影。反射贴图也被渲染。使用屏幕锚将 3D 模型设置为 COS = 0 也可以。希望你的项目也一样。
  • @user949884 检查像素大小(应该是 2 的幂,如 512x512 像素),尝试方形 PNG 或非渐进式 JPG。否则,metaio 帮助台仍然存在,直到 2015 年 12 月 15 日。您可以搜索并寻找答案,类似的问题很多。
  • @user949884 或者检查模型的网格以进行背面剔除。如果法线不向外指向,则模型的纹理在应用到内部时会显示为透明,而背面则是透明的。
  • 好的,降级 targetSdkVersion 确实可以解决这个问题。但如果我这样做,谷歌不会让我重新发布/更新我的应用程序。那么解决办法是什么?
  • @Hiren Dabhi :我认为您必须自己将库(FFMPEG ...)编译为共享对象(-.so)并将有问题的-.so库与更新的-交换。所以。至于我自己,我没有这样做,我不再使用 metaioSDK。据我所知,仍然可以在 GooglePlay 上使用 targetSDKversion = 22 发布应用程序(Unity 应用程序也这样做)。但是,如果应用程序已经发布了版本 23,则无法使用 targetSDK 版本 22。
【解决方案2】:

您可以通过以下方式检查您的共享图书馆是否有文本重定位:

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

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

0x00000016 (TEXTREL)                    0x0

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

ndk-build -B -j 8

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

【讨论】:

  • 我如何通过使用工具或命令提示符来实现这一点?帮帮我
  • 嗨,我遇到了同样的问题,一旦我使用该命令,我就能看到该 TEXTREL 消息。但无法运行该 ndk 命令我在运行该 ndk 命令时遇到此问题:ndk-build: command not found
【解决方案3】:

如果要求加载带有文本重定位的共享库,以前版本的 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 是一个有用的指南。

【讨论】:

    【解决方案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  
    

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

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

    【讨论】:

    • 非常感谢!!我会尽快测试它并告诉你!
    • 对于那些在完全不同的分支上的人,这里是 ffmpeg 修复此问题的确切补丁的链接,link1link2
    • 这真的解决了您的问题吗?我应用了这些补丁,但在重新编译我的库后仍然在 M 上失败。
    • 您好,您可以在构建时共享 lib 文件 (.so) 吗?我无法最终构建它
    • @AReallyGoodName 我有 .so 文件,但它们在文件名中有版本号,并且使用其他 .so 文件中的这些名称来引用它们,因此它们不能被重命名。您能否告诉我们您是如何在没有版本控制的情况下编译 .so 文件的。对不起所有的cmets。 :)
    【解决方案5】:

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

    为了确保它有效,您可以使用上面提到的 readelf。

    干杯

    【讨论】:

    • 您好,我使用的是 windows 机器,您能否告诉我们如何重新编译源代码,如果可以在 Linux/Ubuntu 中完成,请告诉我一个有效的最新构建步骤。现在我正在使用 ffmpeg4android_demo 提供的预建 .so 库,我被困在与你相同的位置,我尝试编译源代码但失败了。如果您有自己的叉子,请指导。
    • 你必须单独编译ffmpeg,不要使用预先构建的.so,因为它们仍然会有文本重定位问题。
    • 感谢您的意见。
    • 没问题,如果有帮助请告诉我
    • 给以后看到这一点的任何人的注意事项 - 将 -disable-asm 与 FFmpeg 一起使用会导致性能下降。在 FFmpeg 问题跟踪器上查看此讨论主题:trac.ffmpeg.org/ticket/4928
    【解决方案6】:

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

    我还没有寻找 FFMpeg 开发人员联系论坛来进行查询或通知错误。不小心认识一个?

    最好的毕业生,克里斯汀

    【讨论】:

    • 再次感谢您的宝贵时间!对不起,如果我没有给你消息,但我还没有收到 Metaio 团队的任何答复。不幸的是,我不知道任何 FFMpeg 论坛,所以我无法帮助你。我希望我们能得到更新,但我对此持怀疑态度。如果我有任何消息,我会在这里回答你!再次感谢!!
    • 我已经尝试了新的更新的 FFMpeg 库。现在它给出了另一个错误: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "avcodec_register_all" referenced by "/data/app/it.productlab.card-1/lib/arm/libmetaiosdk.so"... 看起来像libmetaiosd.so文件中有引用,这意味着所有so库都是与metaio库一起编译的,现在没有metaio就无法解决......
    • 可能是 FFMpeg 版本。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 2017-02-18
    • 1970-01-01
    • 2012-02-27
    • 2016-05-08
    • 1970-01-01
    • 2013-03-21
    • 2011-02-28
    相关资源
    最近更新 更多