ubuntu下交叉编译链的构建——并没有成功==`

来源:互联网 发布:双字符域名注册 编辑:程序博客网 时间:2024/05/23 01:49

“关于爱情,我们永远都是新手”,而关于编程,我们永远都在路上...

毕业设计做完后终于可以开始继续学习了,在大二大三的胡乱摸爬滚打之后,大四差不多确定了自己的方向吧,反正以后工作也是做这一块,趁着还没有正是走入社会,先自己学了点。前两周买了块2410,看了他们光盘里的资料,觉得看视频跟着学太费时间了,而且我个人也不喜欢看视频学,就趁着还没毕业去学校的图书馆借了基本嵌入式的书,书里的介绍的嵌入式开发的步骤还是挺清晰的:

1.开发目标硬件系统,选用不同的开发板这个就不同,和底层硬件打交道的代码也没少写,虽然接触的单片机,但是原理都是操作寄存器,再实现相关逻辑。

2.建立交叉编译工具。这里有好多种选择,书上介绍了两种,当然本着学习的态度,开始看的是编译binutils、gcc、glibc等一步一步构建,然而,可能是书上的资料太老了吧,在ubuntu下采用gcc-4.47版本编译期编译出现一堆问题,无法成功的构建,现在 这里记录下来,以后自己变强了,能够成功了再回过头来。

3.开发BootLoader;

4.开发Linux内核;

5.开发一个根文件系统;

6.开发特定硬件的驱动程序;

7.开发上层应用程序。

有了方向之后,就着手开始学了,之前学校项目有装过双系统,就用它做开发平台开始学习吧。

一、下载必要的工具包

书上给出的几个网站还是比较靠谱的,网址是http://ftp.gnu.org/gnu/在这里以下几个包都是可以下载到的:

1.binutils

2.gcc

3.glibc

linux内核相关的包在其他网站http://ftp.kernel.org下

二、工作目录的建立

我是参考书上建立的工作目录:

在主目录下建立armlinux目录,前者包含build-tools、kernel、tools

build-tools用来存放工具包和配置过程文件;

kernel用来存放linux内核代码;

tools用来存放安装的工具



三、binutils2.15的安装

网站上下载好工具包解压到工作目录之后可以开始安装了

解压工具包:

kanata@blue:~$ cd arm-linux/build-tools/
kanata@blue:~/arm-linux/build-tools$ tar -xjvf binutils-2.15.tar.bz2
下一步可以开始配置:

kanata@blue:~/arm-linux/build-tools$ cd build-binutils/
kanata@blue:~/arm-linux/build-tools/build-binutils$ ../binutils-2.15/configure --target=arm-linux --prefix=/home/kanata/arm-linux/tools/
输入上面代码之后,进行配置,配置产生makefile,设置目标为arm-linux,安装路径是/home/kanata/arm-linux/tools完成之后,可以开始make了:

kanata@blue:~/arm-linux/build-tools/build-binutils$ make

之后控制台输出了一堆不可描述的代码,为了检查是否有错误,make check一下:

kanata@blue:~/arm-linux/build-tools/build-binutils$ make check

果然,不是那么一帆风顺的,看到这段报错信息:

../../../binutils-2.15/libiberty/testsuite/test-demangle.c:43: error: conflicting types for ‘getline’
/usr/include/stdio.h:678: note: previous declaration of ‘getline’ was here
../../../binutils-2.15/libiberty/testsuite/test-demangle.c: In function ‘main’:
../../../binutils-2.15/libiberty/testsuite/test-demangle.c:181: warning: incompatible implicit declaration of built-in function ‘strcspn’
../../../binutils-2.15/libiberty/testsuite/test-demangle.c:217: warning: incompatible implicit declaration of built-in function ‘strspn’
../../../binutils-2.15/libiberty/testsuite/test-demangle.c:261: warning: incompatible implicit declaration of built-in function ‘free’
../../../binutils-2.15/libiberty/testsuite/test-demangle.c:279: warning: incompatible implicit declaration of built-in function ‘free’
make[2]: *** [test-demangle] 错误 1
看到错误信息定位到getline函数去,错误信息指出,在其他头文件也含有getline所以我采取的方法是更改掉了getline的名字,
kanata@blue:~/arm-linux/build-tools/build-binutils$ gedit ../binutils-2.15/libiberty/testsuite/test-demangle.c

改掉之后,重新make并make check,出现如下信息

./test-demangle < ../../../binutils-2.15/libiberty/testsuite/demangle-expected
./test-demangle: 742 tests, 0 failures
make[2]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-binutils/libiberty/testsuite'
make[1]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-binutils/libiberty'

发现没有错误,可以进行安装

kanata@blue:~/arm-linux/build-tools/build-binutils$ make install

结束之后发现tools下多了很多目录:

在bin目录下有一些工具:


到此binutils安装结束


三、boot-trao gcc安装

由于编译内核需要低版本的gcc没办法,去网上下载了gcc-3.3.6用来制作arm-linux-gcc,步骤如下,但是没有成功:


kanata@blue:~/arm-linux/build-tools$ tar -xvzf gcc-3.3.6.tar.gz
kanata@blue:~/arm-linux/build-tools$ mkdir build-gcc

kanata@blue:~/arm-linux/build-tools$ cd build-gcc

按照书上的选项进行配置

kanata@blue:~/arm-linux/build-tools/build-gcc$ ../gcc-3.3.6/configure --target=arm-linux --prefix=/home/kanata/arm-linux/tools/ --enable-languages=c --disable-shared --disable-threads
配置完成后进行make

kanata@blue:~/arm-linux/build-tools/build-gcc$ make

kanata@blue:~/arm-linux/build-tools/build-gcc$ make check

gcc -DHAVE_CONFIG_H -g -O2 -I.. -I../../../gcc-3.3.6/libiberty/testsuite/../../include  -o test-demangle \
        ../../../gcc-3.3.6/libiberty/testsuite/test-demangle.c ../libiberty.a
../../../gcc-3.3.6/libiberty/testsuite/test-demangle.c:43: error: conflicting types for ‘getline’
/usr/include/stdio.h:678: note: previous declaration of ‘getline’ was here
../../../gcc-3.3.6/libiberty/testsuite/test-demangle.c: In function ‘main’:
../../../gcc-3.3.6/libiberty/testsuite/test-demangle.c:166: warning: incompatible implicit declaration of built-in function ‘free’
../../../gcc-3.3.6/libiberty/testsuite/test-demangle.c:169: warning: incompatible implicit declaration of built-in function ‘free’
make[3]: *** [test-demangle] 错误 1
make[3]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/libiberty/testsuite'
make[2]: *** [check-subdir] 错误 2
make[2]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/libiberty'
make[1]: *** [check-libiberty] 错误 2
make[1]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc'
make: *** [check] 错误 2

出现了和配置binutils中同样错误的getline,和上面一样改掉,重新make和make check后出现如下问题

In function ‘open’,
    inlined from ‘collect_execute’ at ../../gcc-3.3.6/gcc/collect2.c:1575:
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:50: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
make[1]: *** [collect2.o] 错误 1

查阅过资料之后发现collect2.c的1575行有错误:

open函数据说少了一个参数,改为如下:

redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT,0773);

重新make && make check

make[2]: arm-linux-ar:命令未找到
make[2]: *** [libgcc.a] 错误 127
make[2]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/gcc'
make[1]: *** [libgcc.a] 错误 2
make[1]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/gcc'
make: *** [all-gcc] 错误 2
kanata@blue:~/arm-linux/build-tools/build-gcc$ make check
make do-check NOTPARALLEL=parallel-ok
make[1]: 正在进入目录 `/home/kanata/arm-linux/build-tools/build-gcc'
make[2]: 正在进入目录 `/home/kanata/arm-linux/build-tools/build-gcc/libiberty'
make[3]: 正在进入目录 `/home/kanata/arm-linux/build-tools/build-gcc/libiberty/testsuite'
./test-demangle < ../../../gcc-3.3.6/libiberty/testsuite/demangle-expected
./test-demangle: 649 tests, 0 failures
make[3]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/libiberty/testsuite'
make[2]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/libiberty'
make[2]: 正在进入目录 `/home/kanata/arm-linux/build-tools/build-gcc/gcc'
(rootme=`${PWDCMD-pwd}`; export rootme; \
    srcdir=`cd ../../gcc-3.3.6/gcc; ${PWDCMD-pwd}` ; export srcdir ; \
    cd testsuite; \
    EXPECT=expect ; export EXPECT ; \
    if [ -f ${rootme}/../expect/expect ] ; then  \
       TCL_LIBRARY=`cd .. ; cd ../../gcc-3.3.6/gcc/../tcl/library ; ${PWDCMD-pwd}` ; \
       export TCL_LIBRARY ; fi ; \
    runtest --tool gcc )
/bin/sh: 8: runtest: not found
make[2]: [check-gcc] 错误 127 (忽略)
make[2]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/gcc'
make[1]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc'
kanata@blue:~/arm-linux/build-tools/build-gcc$

提示arm-linux-ar未找到,步骤二中安装binutils时生成了该工具,我采取的是改变环境变量到bin目录:

kanata@blue:~/arm-linux/build-tools/build-gcc$ sudo vim /etc/environment

为了让配置马上生效,source一下

kanata@blue:~/arm-linux/build-tools/build-gcc$ source /etc/enviroment

/home/kanata/arm-linux/tools/bin:

重新make ,之后出现了束手无策的错误
*** buffer overflow detected ***: arm-linux-ar terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x741cf)[0x2b6f99cc51cf]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x2b6f99d5cb2c]
/lib/x86_64-linux-gnu/libc.so.6(+0x10a9f0)[0x2b6f99d5b9f0]
/lib/x86_64-linux-gnu/libc.so.6(+0x109ef9)[0x2b6f99d5aef9]
/lib/x86_64-linux-gnu/libc.so.6(_IO_default_xsputn+0xbc)[0x2b6f99ccd54c]
/lib/x86_64-linux-gnu/libc.so.6(_IO_padn+0xa0)[0x2b6f99cc1510]
/lib/x86_64-linux-gnu/libc.so.6(_IO_vfprintf+0x3c5d)[0x2b6f99c9ebfd]
/lib/x86_64-linux-gnu/libc.so.6(__vsprintf_chk+0x84)[0x2b6f99d5af84]
/lib/x86_64-linux-gnu/libc.so.6(__sprintf_chk+0x7d)[0x2b6f99d5aedd]
arm-linux-ar[0x409524]
arm-linux-ar[0x407781]
arm-linux-ar[0x409dcd]
arm-linux-ar[0x40d597]
arm-linux-ar[0x40405f]
arm-linux-ar[0x40453f]
arm-linux-ar[0x405017]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x2b6f99c72ec5]
arm-linux-ar[0x401cf9]
======= Memory map: ========
00400000-00459000 r-xp 00000000 08:0b 103991                             /home/kanata/arm-linux/tools/bin/arm-linux-ar
00658000-00659000 r--p 00058000 08:0b 103991                             /home/kanata/arm-linux/tools/bin/arm-linux-ar
00659000-0065a000 rw-p 00059000 08:0b 103991                             /home/kanata/arm-linux/tools/bin/arm-linux-ar
0065a000-0065e000 rw-p 00000000 00:00 0
00b0d000-00d81000 rw-p 00000000 00:00 0                                  [heap]
2b6f99a2c000-2b6f99a4f000 r-xp 00000000 08:0c 786434                     /lib/x86_64-linux-gnu/ld-2.19.so
2b6f99a4f000-2b6f99a51000 rw-p 00000000 00:00 0
2b6f99a51000-2b6f99a58000 r--s 00000000 08:0c 392357                     /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
2b6f99a58000-2b6f99a63000 rw-p 00000000 00:00 0
2b6f99a65000-2b6f99a68000 rw-p 00000000 00:00 0
2b6f99c4e000-2b6f99c4f000 r--p 00022000 08:0c 786434                     /lib/x86_64-linux-gnu/ld-2.19.so
2b6f99c4f000-2b6f99c50000 rw-p 00023000 08:0c 786434                     /lib/x86_64-linux-gnu/ld-2.19.so
2b6f99c50000-2b6f99c51000 rw-p 00000000 00:00 0
2b6f99c51000-2b6f99e0d000 r-xp 00000000 08:0c 786458                     /lib/x86_64-linux-gnu/libc-2.19.so
2b6f99e0d000-2b6f9a00c000 ---p 001bc000 08:0c 786458                     /lib/x86_64-linux-gnu/libc-2.19.so
2b6f9a00c000-2b6f9a010000 r--p 001bb000 08:0c 786458                     /lib/x86_64-linux-gnu/libc-2.19.so
2b6f9a010000-2b6f9a012000 rw-p 001bf000 08:0c 786458                     /lib/x86_64-linux-gnu/libc-2.19.so
2b6f9a012000-2b6f9a017000 rw-p 00000000 00:00 0
2b6f9a017000-2b6f9a6f9000 r--p 00000000 08:0c 138526                     /usr/lib/locale/locale-archive
2b6f9a6f9000-2b6f9a70f000 r-xp 00000000 08:0c 807277                     /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6f9a70f000-2b6f9a90e000 ---p 00016000 08:0c 807277                     /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6f9a90e000-2b6f9a90f000 rw-p 00015000 08:0c 807277                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fff1807e000-7fff180a1000 rw-p 00000000 00:00 0                          [stack]
7fff18133000-7fff18135000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
make[2]: *** [libgcc.a] 已放弃 (core dumped)
make[2]: *** 正在删除文件“libgcc.a”
make[2]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/gcc'
make[1]: *** [libgcc.a] 错误 2
make[1]:正在离开目录 `/home/kanata/arm-linux/build-tools/build-gcc/gcc'
make: *** [all-gcc] 错误 2


说是堆栈溢出==`,我想尝试换用低版本的gcc的,不过在ubuntu14.04 LTS上,换用低版本的gcc的时候配置的时候都出现问题,尝试了很久还是没办法解决,所以到此,我打算换条路....如果有哪位朋友解决过,欢迎交流。

还有可能,书上的资料很老,该方法不适用了。