可执行二进制文件不能 运行 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]
然后,可执行二进制文件运行正常。
我在 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]
然后,可执行二进制文件运行正常。