可执行二进制文件不能 运行 on android marshmallow

executable binary cannot run on android marshmallow

我在 Android 上使用共享库构建了 ffmpeg 可执行二进制文件。但是当我 运行 它在 Marshmallow 上时,我得到以下错误,可执行文件不能 运行.

$ 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)

我在编译二进制文件时已经添加了--extra-ldexeflags="-pie"

可执行二进制文件 运行 在 Marshmallow 之前的设备上正确。

我以前没有遇到过这样的问题,我是不是漏掉了什么重要的东西?我怎样才能让这个二进制文件在 Marshmallow 上运行?

关于我的环境的更多信息。

我用 android-ndk-r10e

SYSROOT=$ANDROID_NDK_ROOT/platforms/android-19/arch-arm 并且工具链版本为

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

如果我将 ffmpeg 构建到单个可执行二进制文件中(构建静态库,然后构建到二进制文件中),它 运行 正确。

经过大量搜索,我在 here 中发现了类似的问题。我的共享库有问题。

FFmpeg build script disable SONAME for android build,因此在通过命令

读取库时没有找到 SONAME

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

像下面这样更改配置脚本,它将起作用。

    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

然后重新编译ffmpeg生成共享库,得到我想要的结果,

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

然后,可执行二进制文件运行正常。