executable binary cannot run on android marshmallow (android 6.0)
http://stackoverflow.com/questions/34492583/executable-binary-cannot-run-on-android-marshmallow
I built ffmpeg
executable binary with shared libraries on Android. But when I run it on
Marshmallow
, I got the following error, the executable can't run.
$ 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)
I already added --extra-ldexeflags="-pie"
when compiled the binary.
The executable binary run properly on pre Marshmallow
device.
I didn't encounter such problem before, did I miss something important? How can I make this binary work on
Marshmallow
?
More information about my environment.
I used android-ndk-r10e
with
SYSROOT=$ANDROID_NDK_ROOT/platforms/android-19/arch-arm
and toolchains version is
arm-linux-androideabi-gcc (GCC) 4.9 20140827 (prerelease)
If I built ffmpeg
into a single executable binary (build the static libraries and then build into binary), it run properly.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
After a lot of searching, I found a similar issue from here. There is a problem with my share libraries.
FFmpeg
build script disable SONAME
for android build, so there is no
SONAME
found when reading library by command
arm-linux-androideabi-readelf -d libavutil.so |grep soname
Change the configuration script like following, it will work.
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
After then, recompile ffmpeg
to generate share libraries, and I got the result I want,
$ arm-linux-androideabi-readelf -d libavutil.so |grep soname
0x0000000e (SONAME) Library soname: [libavutil.so]
Then, the executable binary run properly.
-----------------------------------
/opt/android-on-linux/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-readelf -d out/lib/libzebra.so |grep soname
0x0000000e (SONAME) Library soname: [libzebra.so]
/opt/android-on-linux/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-readelf -d platforms/android-23/arch-x86/usr/lib/libcrypt.so |grep soname
0x0000000e (SONAME) Library soname: [libcrypt.so.1]
/opt/android-on-linux/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-readelf -d platforms/android-23/arch-x86/usr/lib/libc.so |grep soname
0x0000000e (SONAME) Library soname: [libc.so] ???? should be [libc.so.6]
-----------------------------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通