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