苗火 Nicholas
[embedded]crosstool-ng制作交叉编译工具血泪史
2017-3-14 萧
嵌入式开发第一步肯定是弄一个交叉编译工具了,一直很好奇芯片公司给的arm-linux-gcc怎么做的,就算是一些常见的嵌入式开发的书也只是聊聊数语,最后往往说到用crosstool等可以制作,但制作比较麻烦,最好是直接下载他人制作好了的。

我花了段时间,换来了一个完全自主知识产权的交叉编译工具。

其实制作这么一个工具并不那么玄乎,关键是不能走入死胡同。

首先,下载crosstool-ng-1.18.0,不要关注版本,我是正巧看到某个地方的交叉编译工具用这个版本的crosstool-ng制作的,我以后也许会偿试其它版本的。

然后自然是解压、编译、安装,这一切几乎非常顺利,除了其中会有一些前置软件需要安装,那些软件的名称在ctosstool-ng编译过程中会中断告知的。

安装完了之后,要改环境变量PATH,比如我的ctosstool-ng安装在了

/home/nicholas/arm-linux-tools/crosstool-install

那么PATH中要相应加上

/home/nicholas/arm-linux-tools/crosstool-install/bin

修改环境变量是这样的,打开.bashrc,在最后一行的PATH语句后面加上就行了:

vim ~/.bashrc

PATH=*********:/home/nicholas/arm-linux-tools/crosstool-install/bin

这时terminal打一句

ct-ng -v

就可以显示crosstool-ng安装完好了。



接下来,开始利用ctosstool-ng制作交叉编译工具。

首先,创建工作目录、源码目录以及工具安装目录:

cd /home/nicholas/arm-linux-tools

mkdir crosstool-build src tools

将样版配置文件复制到工作目录:

cp crosstool-ng-1.18.0/samples/arm-unknown-linux-gnueabi crosstool-build

cp crosstool-build/arm-unknown-linux-gnueabi/crosstool.config crosstool-build/.config

其中crosstool-ng-1.18.0显然就是crosstool-ng的源码文件目录,crosstool-build为工作目录。

接着,配置:

cd crosstool-build

ct-ng menuconfig

弹出配置界面,主要作以下修改:

1、修改源码目录,后面编译过程中需要用到的代码包会优先从源码目录中找到,否则会自动从网络下载,网络下载在我所在的地方很难成功。

2、修改安装目录,最终交叉编译工具所生成的位置就看它了。

3、CPU架构,Architecture level,对于S3C2440来说是armv4t.

4、CPU指令系统,Emit assembly for CPU,对于S3C2440来说是arm9tdmi。

5、CPU型号,Tune for CPU,对于S3C2440来说是arm920t。

6、最好能选上Debug crosstool-NG、Save intermediate steps,这样能够在编译中断之后接着上一步继续。

完事之后别急着走,下面正式开始编译:

ct-ng build

我就是这里开始来事了,一直报各种奇怪的错误,

比如下载源码失败,这个好说,直接查看build.log,里面会有详细的下载信息,可能由于国家网络原因,也可能由于域名变更的历史原因,甚至广告弹窗等原因而无法正常下载,这个时候只要按照log里面提供的信息下载相应的源码包放到源码目录就行了。

更多的错误是提示

error:stray '177' in program

查看build.log会知道有一些符号、关键字等找不到。

我偿试去修复,天哪,这是个无底洞,这种错误会源源不断地出现,我怀疑不停地修复下去会把整个源码弄个底朝天了。

于是我开始怀疑,是不是编译的gcc版本的问题,于是又开始修改不同gcc版本,相应地也修改不同库的版本,

这其间我发现:

kernel、binutils、gcc、glibc之间是有一种关系的,当然它们本来就有关系,我这里发现的是版本上的关系,版本上我主要靠时间来判断是否相互匹配,当然这必然是不准确的。

突然我碰到某些问题,发现有人增加环境变量'NM'就解决了。

于是我增加.bashrc里面的

export NM='nm'

果然可以解决某些问题。于是我确定只要版本正确,必然能往后面走,于是我不停地换着软件的版本,不停地偿试着。

睡觉的时候突然在想,我为什么会不停地换版本,而不是用crosstool-ng默认的版本呢?

我记起来了,是因为之前的一些错误提示,我换了版本,但换版本之后还是有很多错误提示,这时增加'NM'环境变量后错误会有所解决,显然'NM'是个关键性的东西,但版本更是重中之重啊,crosstool-ng默认的版本配置怎么会有问题呢?

一般应该是用默认配置不会有大问题吧。为什么不试试在有'NM'变量之后的情况下,使用crosstool-ng默认的版本配置进行一次偿试呢?



此时,问题已经解决了。

可能编译的过程中还是会出现中断的问题,看log也看不出个所以然来,但不至于显示

error:stray '177' in 

这时重启下电脑,再接着那一步编译又神奇般地正常通过了。



crosstool-ng变幻莫测,也难怪大多数嵌入式开发的教材会建议读者下载他人制作好的交叉编译工具了。
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容