交叉编译环境学习(编译Android上的可执行程序)
前几天帮忙师兄发现的Android上的一个驱动程序漏洞,奈何技术不够耐心不足,没有找到漏洞的根源。由于程序要由c程序来触发,而c程序是在pc上的开发的,要在Android设备上运行,这就涉及到交叉编译问题。一开始找了好久,想找一个交叉编译工具,想来也是SB,Android不是为我们提供了NDK开发环境么,而且我还学了一段时间,可惜后面没有用,也没有总结,就忘记了。其实,NDK除了为了Native层的开发,还为了我们提供了强大的交叉编译环境。虽然学习过程中Google了n多次,这里的主要参考资料还是官网:standalone toolchain.
在$NDK/toolchains目录下集成了很多交叉编译工具,我的目录是:F:\adt-bundle-windows-x86_64-20140702\NDK\android-ndk-r10e\toolchains;这里主要是用的ARM架构的交叉编译工具。使用的工具根据手机的CPU架构决定。至于怎么使用没什么好说的,直接参考官方文档就好了,这里记录下我纠结了好久的2B错误,以免下载重犯。
按照官方的教程,我的编译命令为:
arm-linux-androideabi-gcc-4.8 --sysroot=F:\adt-bundle-windows-x86_64-20140702\NDK\android-ndk-r10e\platforms\android-21\arch -arm -o C:\Users\*\Desktop\test\hello -c C:\Users\*\Desktop\test\hello.c
结果编译通过了,push到手机中执行的过程中发现出错了:
./hello: not executable: 64-bit ELF file(真机)./hello: not executable: magic 7F45(模拟器)
出错了就是一顿Google,一直找呀么找不到错误,最后无赖之下除了绝招,对比师兄那个可执行的文件和我编译出来的文件; 最后,无可奈何之下,我居然采取help arm-linux-androideabi-gcc-4.8,真是太相信官方文档了,当然其实人家也是对的,真是没有一个好的思维啊,要命!发现上面的编译指令有个 -c 选项,意思是只编译和汇编不链接,这下知道了,去掉-c重新编译,发现运行又出错了:
继续Google错误以及看工具的help文档。原来Android较新的版本引进了PIE这个安全机制,具体没有研究,后面有空再去看看。编译选项直接加上:-pie,在重新编译运行,搞定!完整的可运行的编译命令:
arm-linux-androideabi-gcc-4.8 -pie --sysroot=F:\adt-bundle-windows-x86_64-20140702\NDK\android-ndk-r10e\platforms\android-21\arch-arm -o C:\Users\*\Desktop\test\hello C:\Users\*\Desktop\test\hello.c
最后提一下:Android官方文档中还提供了Advanced Mode,当然还可以直接用ndk-build,至于 Advanced Mode大致看了两眼,没去试了,以后有需求再去弄吧~ 更多相关文章
- Android NDK rb5 文档之使用 Android 工具链作为一个独立编译器
- Android sdk自带的9patch工具(9妹)
- Android开发中定制自己的日志工具
- Android Studio第4部分:调试工具和生产力插件
- 如何看待 Kotlin 成为 Android 官方支持的开发语言?一线开发者这
- 【Android 工具】Android 点9图片制作及讲解
- Android studio怎么使用代码检查工具Analyze?