zoukankan      html  css  js  c++  java
  • executable binary cannot run on android marshmallow (android 6.0)


    http://stackoverflow.com/questions/34492583/executable-binary-cannot-run-on-android-marshmallow


    I built ffmpeg executable binary with shared libraries on Android. But when I run it on Marshmallow, I got the following error, the executable can't run.

    $ LD_LIBRARY_PATH=./lib ./bin/ffmpeg
    CANNOT LINK EXECUTABLE: cannot find "libavformat.so" from verneed[0] in DT_NEEDED list for "./bin/ffmpeg"
    page record for 0xb6eee00c was not found (block_size=16)

    I already added --extra-ldexeflags="-pie" when compiled the binary.

    The executable binary run properly on pre Marshmallow device.

    I didn't encounter such problem before, did I miss something important? How can I make this binary work on Marshmallow?

    More information about my environment.

    I used android-ndk-r10e with

    SYSROOT=$ANDROID_NDK_ROOT/platforms/android-19/arch-arm and toolchains version is

    arm-linux-androideabi-gcc (GCC) 4.9 20140827 (prerelease)

    If I built ffmpeg into a single executable binary (build the static libraries and then build into binary), it run properly.

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


    After a lot of searching, I found a similar issue from here. There is a problem with my share libraries.

    FFmpeg build script disable SONAME for android build, so there is no SONAME found when reading library by command

    arm-linux-androideabi-readelf -d libavutil.so |grep soname

    Change the configuration script like following, it will work.

        android)
        disable symver
        enable section_data_rel_ro
        SLIB_INSTALL_NAME='$(SLIBNAME)'
        SLIB_INSTALL_LINKS=
        # soname not set on purpose
        # soname should set for new version Android
        SHFLAGS='-shared -Wl,-soname,$$(word 1,$$(subst ., ,$$(@F))).so'
        # SHFLAGS=-shared

    After then, recompile ffmpeg to generate share libraries, and I got the result I want,

    $ arm-linux-androideabi-readelf -d libavutil.so |grep soname
    0x0000000e (SONAME)                     Library soname: [libavutil.so]

    Then, the executable binary run properly.

    -----------------------------------
    /opt/android-on-linux/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-readelf -d out/lib/libzebra.so |grep soname

     0x0000000e (SONAME)                     Library soname: [libzebra.so]

    /opt/android-on-linux/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-readelf -d platforms/android-23/arch-x86/usr/lib/libcrypt.so |grep soname

     0x0000000e (SONAME)                     Library soname: [libcrypt.so.1]

    /opt/android-on-linux/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-readelf -d platforms/android-23/arch-x86/usr/lib/libc.so |grep soname

     0x0000000e (SONAME)                     Library soname: [libc.so]   ???? should be [libc.so.6]


    -----------------------------------


  • 相关阅读:
    取代iframe,实现页面中引入别的页面
    axios请求
    接口跨域
    es7,es8
    promise
    移动端开发调试工具神器--Weinre使用方法
    资本论第一卷笔记
    2018春季实习生校招面经(一)阿里篇
    linux小实验-考勤模拟程序
    在基于debian的deepin或者Ubuntu上双等号“==”和双中括号“[[]]”不能使用的真相
  • 原文地址:https://www.cnblogs.com/ztguang/p/12646278.html
Copyright © 2011-2022 走看看