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]


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


posted @ 2016-06-25 23:25  张同光  阅读(190)  评论(0编辑  收藏  举报