【问题标题】:executable binary cannot run on android marshmallow可执行二进制文件无法在 android marshmallow 上运行
【发布时间】:2016-04-02 05:56:21
【问题描述】:

我在 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 构建到单个可执行二进制文件中(构建静态库,然后构建到二进制文件中),它可以正常运行。

【问题讨论】:

    标签: android ffmpeg android-ndk cross-compiling android-6.0-marshmallow


    【解决方案1】:

    经过大量搜索,我从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]
    

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

    【讨论】:

    • 现在无法访问该链接。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2014-11-11
    • 2013-08-04
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多