X86架构的CPU采用的是复杂指令集(Complex Instruction Set
Computer,CICS),而ARM架构的CPU使用的是精简指令集(Reduced Instruction Set
Computer,RISC)。由于这两种架构的CPU使用了不同的指令集,因此在X86架构上开发可运行在ARM架构上的程序就必须要使用交叉编译器。
通常交叉编译器和相关工具包含的了很多可执行文件以及大量的共享库及头文件等资源。这些资源的集合称为交叉编译环境。
在Internet上可以找到集成好的交叉编译环境,Android
NDK和Android源代码中也包含的交叉编译环境。当然,如果我们需要一个完全独立的交叉编译环境,可以下载集成好的交叉编译环境,也可以自己制作
(比较复杂,建议读者下载集成好的交叉编译环境)。下面介绍一个CodeSourcery交叉编译环境,这个交叉编译环境直接下载安装就可以安装。
读者可通过如下的网站访问CodeSourcery下载页面。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
上面的页面并未直接提供CodeSourcery的下载链接,读者可以点击“Download the GNU/Linux
Release”链接,并输入Email(建议使用Gmail)、地址等信息,最后点击“Get
Lite!”按钮提交信息。如图2-29所示。最后系统会将下载地址发送到刚才输入的Email。
进入下载页面,会看到如图2-30所示的不同版本的下载链接,选择最新的版本即可。
图2-30 CodeSourcery的不同版本
进入CodeSourcery的下载页面后,会看到如图2-31所示的下载链接。目前CodeSourcery有Windows和Linux两个版本。本书使用的是第1个(IA32 GNU/Linux Installer)。
Linux版本的安装文件是bin格式,读者可执行下面的命令安装CodeSourcery。其中package表示CodeSourcery的安装文件名。
sh package.bin
执行上面的命令后,会显示可视化的安装界面,如图2-32所示,读者可按提示安装CodeSourcery。
为了使用方便,建议读者将如下路径加到PATH环境变量中。
/root/compilers/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin
下面编写一个简单的C程序来测试一下这个交叉编译环境。
// first.c
#include <stdio.h>
int main()
{
printf("first arm program\n");
return 0;
}
输入下面的命令编译first.c文件(需要加-static选项)。
# arm-none-linux-gnueabi-gcc -static -o first first.c
输入下面的命令将first文件上传到任意的Android设备的/data/local目录中(没有root权限也可以)。
# adb push first /data/local
使用adb shell命令进入Android设备的控制台,并进入/data/local目录,执行如下的命令
# ./first
执行上面的命令就会输出“first arm program”信息。first程序在X86架构上运行的Ubuntu Linux中是无法运行的。读者可以试着在Ubuntu Linux中运行first程序,看看会发生什么。
注意:在安装Code Sourcery的过程中会在/lib目录寻找一个libc.so.6库文件,但在Ubuntu
Linux11.04及以上版本/lib目录已经没有libc.so.6库文件了。这个库文件被放在了其他的目录。在32位的Ubuntu
Linux中该文件的路径是/lib/i386-linux-gnu/libc.so.6,在64位的Ubuntu
Linux中该文件的路径是/lib/x86_64-linux-gnu/libc.so.6。在安装Code
Sourcery之前可以使用ln命令为libc.so.6文件在/lib目录建立一个链接。
本文节选至《Android深度探索(卷1):HAL与驱动开发》,
接下来几篇文章将详细阐述如何开发ARM架构的Linux驱动,并分别利用android程序、NDK、可执行文件测试Linux驱动。可在ubuntu
Linux、Android模拟器和S3C6410开发板(可以选购OK6410-A开发板,需要刷Android)
新浪微博:http://t.sina.com.cn/androidguy 昵称:李宁_Lining