由于嵌入式系统硬件上的特殊性,一般不能安装发行版的Linux系统,例如,Flash存储空间很小,没有足够的空间安装;或者处理器很特殊,也没有发行版的Linux系统可用。所以需要专门为特定的目标板定制Linux操作系统,这必须要相应的开发环境,于是人们想到了交叉开发模式。在开发主机上,可以安装开发工具、编辑、编译目标板的Linux引导程序、内核和文件系统,然后在目标板上运行。通常这种在主机环境下开发,在目标板上运行的开发模式叫作交叉开发。
自己从源代码构建arm-linux 交叉编译工具链是一件很麻烦的事情,所以如果能下载预先编译好的工具链是比较节省时间的做法。
arm-linux-gcc版本4.3.2:http://code.google.com/p/princess-alist/downloads/detail?name=arm-linux-gcc-4.3.2.tgz&can=2&q=label%3AFeatured
下面介绍一下arm-linux-gcc的安装。
安装交叉编译工具链步骤如下。
(1)以root用户登入。
(2)复制arm-linux-gcc-4.3.2.tgz到根目录下tmp文件夹里。
(3)解压命令。
注意,tgz和-C之间有空格,-C是大写,-C和/之间有空格。
(4)配置编译环境的路径。
① 在小红帽的终端里输入:[root@localhost ~]gedit /root/.bashrc。
注意,gedit和/root之间有空格,bashrc前面有一个点(“.”)。
② 文字编辑器中打开.bashrc文件,在文件最后(最后一行)加上下面代码:export PATH=/usr/local/arm/4.3.2/bin:$PATH
注意,是在最后添加新行。
③ 保存关闭后,注销当前用户(Ctrl+Alt+Backspace),用root账号重新登录系统(使刚刚添加的环境变量生效)。
④ 在终端里输入:[root@localhost ~]arm-linux-gcc -v 。
如果安装成功,则将会输出 arm-linux-gcc的版本号,如图2.1所示。
若想让它在非超级用户下使用(自己还没有使用过)。那首先,以用户登入。
(1)输入命令:vi ~/.bashrc,编辑.bashrc文件,在文件末尾加入的内容
export PATH=/usr/local/arm/4.3.2/bin:$PATH。
图2.1 查看arm-linux-gcc的版本号
(2)输入命令:gedit /etc/profile,在文件的末尾加上PATH=/usr/local/arm/4.3.2/bin:$PATH。
保存对profile的修改后,执行source /etc/profile就OK了。同样地,先注销当前用户,再登录后进入控制台执行arm-linux-gcc -v 看看能否执行成功就可以了。
使用arm-linux-gcc编译程序的方法与gcc一致。其编译过程如图2.2所示。
图2.2 C编译器生成可执行文件流程图
Linux系统中可执行的文件有两种格式。第一种格式是a.out格式,这种格式用于早期的Linux系统及 UNIX系统的原始格式。a.out来自于UNIX C编译程序默认的可执行文件名。当使用共享库时,a.out格式就会发生问题。把a.out格式调整为共享库是一种非常复杂的操作,由于这个原因,一种新的文件格式被引入UNIX系统5的第四版本和Solaris系统中。它被称为可执行和连接的格式(ELF)。这种格式很容易实现共享库。ELF格式已经被Linux系统作为标准的格式采用。gcc编译程序产生的所有的二进制文件都是ELF格式的文件(即使可执行文件的默认名仍然是a.out)。较旧的a.out格式的程序仍然可以运行在支持ELF格式的系统上。
总体选项如下所示。
(1)-E 预处理后就停止。
(2)-S编译后就停止。
(3)-c预处理、编译、汇编,但不进行链接。
(4)-o file指这输出文件为file.。
(5)-v显示版本号。
(6)-Wall 基本打开所有需要注意的警告信息。
(7)-g产生调试信息。
(8)-O -O1 -O2优化选项。
(9)-llibrary 连接名为library的库文件。
(10)-nostartfiles 不连接系统标准启动文件,而标准库仍然正常使用启动文件。crt1.o,crti.o,crtend.o,crtn.o等没被连接。
(11)nostdlib不连接系统标准启动文件和标准库文件。
(12)-static阻止连接共享库。
(13)-shared 生成一个共享OBJ文件。
(14)-Xlinker option 把选项option传递给连接器。
(15)-W1,option 把选项option传递给连接器。
(16)-u symbol使连接器认为取消了symbol的符号定义。
(17)-Idir 在头文件的搜索路径中加入dir目录。
(18)-I- 使搜索路径适用于#include指令。
(19)-Ldir 添加dir目录。
(20)-Bprefix这个选项指出在何处寻找可执行文件、库文件及编译器自己的数据文件。