簡體   English   中英

libavcodec.so:有文本重定位

[英]libavcodec.so: has text relocations

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

有沒有人知道這個或至少一個解決方法的可能解決方案? 我很難找到解決方案,但我無法理解問題可能是什么。

今天,在Nexus 6(Motorola)上使用Android 6.0測試我的應用程序時,我收到了相同的錯誤消息。 我通過檢查清單文件中的targetSDKVersion解決了我的問題。 使用“22”而非“23”作為targetSDKVersion解決了它。 (見下文)

<uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="22" />

我還檢查了編譯版本和targetSDKversion的build.gradle文件:

compileSdkVersion 22
    buildToolsVersion '22.0.1'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
    }

希望這會幫助你。 但是,現在這只是一個短期的解決方法,我希望我們會從metaio獲得一些反饋。

此致,克里斯汀

如果要求加載具有文本重定位的共享庫,則以前版本的Android會發出警告:

“libfoo.so有文本重定位。這會浪費內存並防止安全性加劇。請修復。”

盡管如此,操作系統仍會加載庫。 如果您的應用程序的目標SDK版本> = 23,Marshmallow會拒絕庫。系統不再記錄此因為它假定您的應用程序將記錄dlopen(3)故障本身,並包含來自dlerror(3)的文本,它解釋了問題。 不幸的是,在這種情況下,許多應用程序似乎捕獲並隱藏UnsatisfiedLinkError throw by System.loadLibraryUnsatisfiedLinkError throw by System.loadLibrary ,通常不會發現庫無法加載,直到您嘗試調用其中一種本機方法並且VM抱怨它不存在。

您可以使用命令行scanelf工具檢查文本重定位。 您可以在互聯網上找到有關該主題的建議; 例如https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide是一個有用的指南。

好的,即使設置了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中使用動態重定位選項。

您可以通過執行以下操作來檢查您的共享lbirary是否具有文本重定位:

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

如果它有文本重定位,它會顯示如下:

0x00000016 (TEXTREL)                    0x0

如果是這種情況,您可以使用最新的NDK版本重新編譯共享庫:

ndk-build -B -j 8

如果再次檢查它,grep命令將不返回任何內容。

經過很長一段時間的努力,並嘗試以不同的方式編譯FFmpeg,我找到了解決方案。 確保使用--disable-asm標志編譯FFmpeg。 這將確保FFmpeg不會有文本重定位,並且在針對Android M進行編譯時不會崩潰(SDK 23)

為了確保它有效,您可以使用如上所述的readelf。

干杯

我收到了metaio的SDK團隊的反饋。 他們說metaio不能輕易解決這個問題,因為它與FFMpeg庫有關。 我們不得不希望更新FFMpeg來解決這個問題。 我假設我們必須等待這樣的更新並在應用程序中交換庫文件。

我還沒有找到FFMpeg開發者聯系論壇來查詢或通知錯誤。 你偶然知道嗎?

最好的regrads,克里斯汀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM