一、什么是交叉编译工具链?
交叉编译工具链就是为了在平 台体系结构下(如X86 PC机)能编译,链接,处理和调试另一个平台体系结构下(如ARM)的程序,使得编译生成的程序能够在另一平台下运行。简单地说,就是在一个平台上生成另 一个平台上的可执行代码。
二、本次制作交叉编译工具链使用软件:
交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发, 交叉编译工具链主要由binutils、gcc和glibc 3个部分组成。
Linux使用的工具链软件是:Binutils,gcc,glibc,gdb。
其中binutils是二进制程序处理工具。gcc是编译器。glibc是应用程序编程的函数库文件软件包。gdb是调试工具。
三、使用环境:
以X86平台,虚拟机VMware Workstation V5.5.1,RHEL4.0来建立arm交叉编译工具链。
四、开始制作:
1、准备
首先从网上下载所需资源文件linux-2.6.27.tar.bz2、binutils-2.15.tar.bz2、gcc- 3.3.6.tar.bz2、 glibc- 2.3.2.tar.bz2、glibc-linuxthreads-2.3.2.tar.gz和linux-libc-headers- 2.6.12.0.tar.bz2。然后将这些工具包文件放在新建的/home/downloads(刚开始文件名是建立成download,后来改成 downloads)目录下,最后在/home目录下解压crosstool-0.42.tar.gz,命令如下:
解压crosstool-0.43压缩包:
2、建立脚本文件
接着需要建立自己的编译脚本,起名为arm.sh,为了简化编写arm.sh,寻找一个最接近的脚本文件demo-arm.sh作为模 板,然后将该脚本的内容复制到arm.sh,修改arm.sh脚本,具体操作如下:
修改后的arm.sh脚本内容如下:
找到这一句#eval 'cat arm.dat gcc-3.3.6-glibc-2.3.2.dat' sh all.sh –notest,然后将其注释号#去掉(这一句为编译工具链的执行语句)
其中一些解释:
TARBALLS_DIR=/home/mike/downloads # 定义工具链源码所存放位置。
RESULT_TOP=/opt/crosstool # 定义工具链的安装目录
GCC_LANGUAGES="c,c++" # 定义支持C, C++语言
3.建立配置文件
在arm.sh 脚本文件中需要注意arm.dat和gcc-3.3.6-glibc-2.3.2.dat两个文件,这两个文件是作为Crosstool的编译的配置文 件。其中arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。gcc-3.3.6-glibc- 2.3.2.dat该文件主要定义编译过程中所需要的库以及它定义的版本。
修改后的arm.dat内容如下:(可以不用修改)
w KERNELCONFIG='pwd'/arm.config # 内核的配置
w TARGET=arm-linux # 编译生成的工具链名称
w TARGET_CFLAGS="-O" # 编译选项
修改后的gcc-3.3.6-glibc-2.3.2.dat的内容如下:
4.执行脚本
经过2个小时左右的编译,会在/opt/crosstool目录下生成新的交叉编译工具,如下绿色所示:
5、添加环境变量:
将生成的编译工具链路径添加到环境变量PATH上去,添加的方法是在系统/etc/ bashrc文件的最后添加export PATH=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin:$PATH ,其目的是让每次启动终端时就自动配置PATH路径。
在重新启动一个终端,并输入命令arm-linux-gcc –v时输出了下面一串信息,说明交叉编译工具链制作成功。
6.测试交叉编译工具链
下面通过一个简单的程序测试刚刚建立的交叉编译工具链看是否能够正常工作。写一个最简单的test1.c源文件,内容如下:
通过以下命令进行编译,编译后生成名为test的可执行文件,通过file命令可以查看文件的类型。当显示以下信息时表明交叉工具链正常安装了,通 过编译生成了ARM体系可执行的文件。
7、出现过的问题:
①.当执行./arm.sh时出现如下的错误:
②以上解决是切换到普通用户,但同时又出现了先的问题:
③所以我就切换回root用户,重新编译就可以,但又有了新问题:
问题是没有了binutils-2.15.tar.bz2压缩包,所以把这个压缩包COPY到downloads文件下
之后就OK了!
④当我打开一个新的终端是出现下面的错误
原因是在修改/etc/bashrc文件时多了
把上面几行删除掉就行了