前言:
因为准备学习lwip,之前在stm32上移植跟着教程走得差不多了,但是用的keil。所以想在一个新平台移植一下巩固巩固,正好有2440的板子,也学一下gcc-make这样的开发流程,配套的编译器很老,编译配套的linux2.6.22.6内核还是没问题的,但是当我用裸机模板创建一个包含lwip的代码的工程时,编译就会出现以下错误:
collect2: ld terminated with signal 11 [Segmentation fault], core dumped /home/streleizia/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/../../../../arm-linux/bin/ld: Warning: gc-sections option ignored /home/streleizia/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/../../../../arm-linux/bin/ld: BFD 2.15 assertion fail /work/tools/create_crosstools/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6/binutils-2.15/bfd/elf32-arm.h:3905 Makefile:176: recipe for target 'build/lwip.elf' failed
搜索了很多都没有找到解决方案,于是我又尝试自己按照教程重新制作配套的工具链,但是很不幸,以前的源码已经不能在我的ubuntu18.04lts上正常编译了,随后我又尝试了arm-none-eabi-gcc 以及 linaro 的gnueabihf(很明显s3c2440并没有fpu完全不合适,但当时乱投医了),最后都因为各种问题失败了,最后的最后决定用crosstool-ng自己为s3c2440制作一个交叉编译器
环境介绍:
VMware16 ubuntuserver18.04 crosstool-ng-1.24.0(尽量用这个版本,在我的机器上gcc7.5编译gcc6.3有bug 用ctng1.24就换成gcc6.5了,可以解决这个问题) gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
安装ctng
下载解压cd到目录 ./configure --prefix=安装目的位置 make && make install export 安装目的位置 到path 或者修改~/.bashrc 再在自己想要的地方建一个目录用于放置最后输出的交叉编译工具
cd 到这个目录,后面menuconfig和build命令都要在这个目录下执行.
配置目标
按照官网的说法,就是:
./configure --prefix=/some/place
make
make install
export PATH="${PATH}:/some/place/bin"
cd /your/development/directory
ct-ng help
ct-ng menuconfig
ct-ng build
在ct-ng安装目录下 share/sample/ 里有一些config模板,拷贝到交叉编译器的输出目录下,重命名为.config然后执行ct-ng menuconfig这一部分也可以参考ctng的官网教程,没有几页很快就能看完了
在menu主页切换到Target options选项,如果已经是arm了那前面步骤就没有问题,在这页选项里,对于2440 **Architecture level**要填armv4t Emit assembly for CPU要填arm9tdmi,填完Emit assembly for CPU后architecture选项会消失,这是正常现象(其实直接填Emit assembly for CPU选项就好了,ctng会自动决定另外俩个选项的内容,这也是现代软件带来的好处).Floating point:选择soft 然后我去掉了Use the MMU毕竟只是为了编译裸机代码(后面有需要再重新编译一遍就是了)
在menu主页切换到Paths and misc options选项在这里可以配置目标输出目录,下载包存放目录等等,根据自己喜好配置就行了下面有个Number of parallel jobs选项,就是编译时的线程数,根据自己电脑配置填就行了,比如我的笔记本是8核16线程,我就填了8
在menu主页切换到C compiler选项,在Version of gcc选项可以选择交叉编译器的gcc版本,我选择的是6.5
在menu主页切换到Debug facilities 勾选gdb 回车进入gdb配置,版本我选了7.12.1再勾选上Build a static cross gdb
保存退出
编译目标
执行ct-ng buildctng将会联网下载编译所需软件包,如果网络问题有些包下载不下来,就手动去下载好并放在Paths and misc options选项配置的src目录下就行了,重新build,ct-ng检测到就会跳过下载.
如果一切正常就能在输出目录下得到编译好的交叉工具了,添加到path就可以快乐编译了.在我的环境下编译原来的工程,很顺利地得到了bin文件,烧录到nand上,成功进入主函数点亮led哈哈哈哈,终于可以开始编写网卡驱动了,一切的幸苦都是值得的.