前几天帮忙师兄发现的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大致看了两眼,没去试了,以后有需求再去弄吧~


更多相关文章

  1. Android NDK rb5 文档之使用 Android 工具链作为一个独立编译器
  2. Android sdk自带的9patch工具(9妹)
  3. Android开发中定制自己的日志工具
  4. Android Studio第4部分:调试工具和生产力插件
  5. 如何看待 Kotlin 成为 Android 官方支持的开发语言?一线开发者这
  6. 【Android 工具】Android 点9图片制作及讲解
  7. Android studio怎么使用代码检查工具Analyze?

随机推荐

  1. 在文件中添加新数据后,JComboBox不会刷新
  2. java中Date无法获取数据库时分秒的问题
  3. Java实践(一)---程序设计概述
  4. Java - 检查所有行中现有文本的.txt
  5. JavaScript进行简单的随即验证码生成(适合
  6. Android推荐跟踪不支持谷歌播放
  7. OOP面向对象编程(一)-------方法的重载
  8. 树形结构的处理——组合模式(四)
  9. springMVC使用html视图配置详解
  10. 80端口占用异常解决方法java.net.BindExc