可执行二进制文件无法在android marshmallow上运行

时间:2015-12-28 11:21:54

标签: android ffmpeg android-ndk cross-compiling android-6.0-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构建到单个可执行二进制文件中(构建静态库然后构建为二进制文件),它就可以正常运行。

1 个答案:

答案 0 :(得分:3)

经过大量搜索,我在here找到了类似的问题。我的共享库存在问题。

FFmpeg构建脚本禁用SONAME用于android构建,因此在按命令读取库时找不到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]

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