手工编译C模块

上一篇中(即《Android编译Native C 模块 》),我们试用了通过标准的 Android.mk 文件来编译 C 模块,下面我们来试试如何直接运用 gcc 命令行来编译,从而了解Android编译环境的细节

 

Clean上次生成的东西:

Android编译 环境提供了 ”showcommands” 选项来显示编译命令行, 我们可以通过打开这个选项来查看一些编译时的细节。当然,在这之前要把上一篇中的 helloworld 模块 clean:


上面的 “make clean-$(LOCAL_MODULE)” Android编译 环境提供的 make clean 的方式。

 

showcommands:

接下来使用 showcommands 选项 重新编译 helloworld:


 

从上面的命令行可以看到, Android编译 环境所用的交叉编译工具链是 prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc -I -L 参数指定了所用的 C 库头文件和动态库文件路径分别是 bionic/libc/include out/target/product/generic/obj/lib ,其他还包括很多编译选项以及 -D 所定义的预编译宏。

 

手工编译:

我们可以利用上面的编译命令,稍加简化来手工编译 helloworld 程序。先手工删除上次编译得到的 helloworld 程序:



再用 gcc 编译,生成目标文件:


Android.mk 编译参数比较,上面主要减少了不必要的 -I 参数。

接下来生成可执行文件:


这里值得留意的是参数“ -Wl,-dynamic-linker,/system/bin/linker ”,它指定了 Android 专用的动态链接器 /system/bin/linker ,而不是通常所用的 ld.so


查看成果:  

生成的可执行程序可用 file readelf 命令来查看一下:


这是 ARM 格式的动态链接可执行文件,运行时需要 libc.so libm.so 。“ not stripped ”表示它还没被 STRIP

嵌入式系统中为节省空间通常将编译完成的可执行文件或动态库进行 STRIP ,即去掉其中多余的符号表信息。在前面“ make helloworld showcommands ”命令的最后我们也可以看到, Android编译 环境中使用了 out/host/linux-x86/bin/soslim 工具进行 STRIP

 

原文连接:

http://www.top-e.org/jiaoshi/html/161.html

有关 Android Toolchain 的其他一些内容可参考: Android Toolchain Bionic Libc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值