主 机:运行编译过程的计算机。
目标机:运行编译结果(可执行文件)的计算机。
交叉编译就是在主机上为目标机编译,比如在PC上编译,然后在手机上运行。
ARM开发过程使用交叉编译,即在安装有交叉编译工具链的主机上编译程序,然后将编译生成的可执行文件在目标机上运行。
ARM交叉编译工具链包含工具见表1。
表1 ARM工具链 |
||
工具名 |
目前最新版本 |
简述 |
binutils |
2.20.1 |
ARM二进制工具 |
gcc |
4.5.0 |
编译器 |
gdb |
7.1 |
调试器 |
newlib |
1.18.0 |
运行库 |
本文介绍Linux主机上建立Codesourcery G++ ARM交叉工具链。Codesourcery G++是增强的GUN ARM工具链,目前最新版本2010q1-188。 Codesourcery G++提供编译好的可执行文件,同时提供源文件。本文介绍从源文件基础上建立工具链的过程。
Codesourcery G++是Codesourcery公司在GUN工具链基础上制作的ARM交叉工具链,是其公司Codesourcery G++ Lite ARM集成开发工具的编译器。Codesourcery开源了Codesourcery G++编译器,但Codesourcery G++ Lite IDE是收费的。Codesourcery G++更新快,代码编译效率高,支持最新ARM内核,包括CortexA8,CortexA9内核。
Codesourcery使用的GUN工具链版本见表2。
从表中可以看出Codesourcery使用的GUN工具版本比较新。
表2 Codesourcery GUN工具版本 |
|
工具名 |
版本 |
binutils |
2.19.51 |
gcc |
4.4.1 |
gdb |
7.0.51 |
newlib |
1.17.0 |
Codesourcery工具链安装成功后工具见图1。
|
图1 Codesourcery安装后工具列表 |
Codesourcery G++的源代码可以在www.codesourcery.com网站上获得。源文件名为arm-2010q1-188-arm-none-eabi.src.tar.bz2。解压后的目录结构见图2。
图2中可以看出源文件包含binutils、gcc、gdb、make、newlib等工具。其中包含安装脚本arm-2010q1-188-arm-none-eabi.sh,脚本包含个工具的安装命令。此脚本是当前版本Codesourcery G++生成中使用的脚本。但本脚本是在作者机器上运行的脚本,如果重新编译Codesourcery G++则需要修改本机环境以使安装脚本正常执行。机器环境修改修改过程见第3节。
|
图2 Codesourcery G++源文件 |
#you may not be able to successfully run this script directly on your system. Certain aspects of the CodeSourcery build environment (such as directory names) are included in these commands.
# task [030/174] /i686-pc-linux-gnu/host_cleanup
# task [0xx/174] /xx
脚本执行后首先复制源文件包,然后解压各源文件,然后分别配置,编译,安装各个包。
执行脚本需要按一下步骤修改脚本
1. 切换到root权限
2. 复制文件到/scratch/julian/2010q1-release-eabi-lite/src中
3. 注释没有提供的包;如:# task [028/174] /init/source_package/qmtest_ph
4. 在/usr/bin目录下创建软连接:
ln –s i686-pc-linux-gnu-gcc gcc
ln –s i686-pc-linux-gnu-g++ g++
ln –s i686-pc-linux-gnu-ar ar
ln –s i686-pc-linux-gnu-ranlib ranlib
5. 修改PATH值 /bin:/usr/bin:/usr/local/bin
安装过程中应该添加log,记录脚本执行结果。
添加如下两个函数:
savelog()
{
echo "$1" "$2">>2010q1install.log
echo "$1" "$2"
}
clearlog()
{
rm -f 2010q1install.log
touch 2010q1install.log
}
其中clearlog函数生成2010q1install.log,2010q1install.log记录安装过程。Savelog函数记录log,savelog函数需要两个参数,savelog将参数写入log文件。同时savelog也将参数输出到控制台。
首先将将clearlog放置到脚本文件中来生成2010q1install.log文件,然后将脚本中的# task全文替换为savelog,安装过程则自动记录到log文件中。
# task [001/174] /init/dirs
savelog [001/174] /init/dirs
安装过程中可能出现许多问题,特别是文件依赖,此时就可以利用log文件来解决。
安装如果中途停止,首先查看log文件,可以知道脚本已经执行到了第几个task了,这说明前面的task已经成功。下次执行脚本时可以将成功执行的任务脚本注释掉。
查看控制台的输出错误,获得错误信息,安装依赖包,然后重新执行已经注释了前面任务的脚本。
如执行# task [053/174] /i686-pc-linux-gnu/toolchain/binutils/install时出错,提示texinfo依赖不存在,然后下载texinfo-4.8.tar.bz2,编译并安装。注释之前的task,重新执行脚本。