好久都没有写文章了 ,经过了将近半年的奔走,总算能够写点东西了!在广州作业时 ,搭档极力推荐我用ubuntu,运用之后确实很爽,并决议今后在ubuntu下作业,完全能够扔掉windows(晕到死)。决议开端 移植Linux到mini2440。首要便是在ubuntu下树立穿插编译东西链。借着在Fedora 下树立ARM-Linux的穿插编译东西的阅历,按理说应该是不会有问题的,可是结果是比在Fedora下碰到的问题多得多了。以下先介绍成功编译的过 程,碰到的问题和处理办法后边说。
这次编译进程中对我有严重协助的材料有:
《 编译Mysql时configure: error: No curses/termcap library found 的过错处理办法》
《[原创]在ubuntu下着手编译arm-elf东西》
《在ubuntu下运用crosstool制造穿插编译东西》
《 ubuntu 8.04中编译ARM穿插渠道的一点心得!》
关于crosstool的基本知识在我曾经的
《在 Fedora 下树立 ARM-Linux 穿插编译环境》
中已有介绍,这儿我再多说,以下是详细进程:
(1)确保你的ubuntu8.10下装置了以下软件开发东西。
Bison
flex
build-essential
patch
libncurses5-dev
我并没有试过没装这些东西的结果,都是网上的阅历,你要是不信这个邪,就自己吃吃这个螃蟹。
(2)由于ubuntu8.10自带的是gcc-4.3.2无法用crosstool正常编译穿插编译器,所以有必要装置gcc-4.1,可是不用卸载4.3.2。办法是用新立得软件包管理器装置gcc-4.1,之后 参阅
chinazcw
的办法
sudo rm /usr/bin/gcc (删去GCC,它仅仅个到gcc-4.3.2的软衔接文件)
sudo ln-s /usr/bin/gcc-4.1 /usr/bin/gcc (树立GCC到gcc-4.1的软衔接)
(3)假如你运转
ls -la /bin/sh
指令看到/bin/sh其实是一个指向dash的软链接,则请运转以下指令,将/bin/sh链接到bash。
sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh
(4)依照老办法修正crosstool的文件:demo-arm9tdmi.sh、gcc-4.1.1-glibc-2.3.2.dat,最终运转demo-arm9tdmi.sh。这些进程请参阅我曾经的文档
《在 Fedora 下树立 ARM-Linux 穿插编译环境》
。
进程就这么简略,可是有些是用失利换来的。下面介绍下我的编译血泪史:
一开端,我并不想用gcc-4.1而是想用自带的gcc-4.3.2,然后………………….
(1)编译到glibc的时分,在装备的时分会检测gcc的版别,configure 脚本以为gcc-4.3.2版别太老(其实是由于其时gcc还没有这么高的版别,只需不是3.2到4.1之间的版别,都以为too old),不能编译。
这是能够处理的,办法便是修正glibc-2.3.2根目录下的configure 文件中的第1275行:
test -n “$CC” && break
done
if test -z “$CC”; then
ac_verc_fail=yes
else
# Found it, now check the version.
echo “$as_me:$LINENO: checking version of $CC” >&5
echo $ECHO_N “checking version of $CC… $ECHO_C” >&6
ac_prog_version=`$CC -v 2>&1 | sed -n s/^.*version /([egcygnustpi-]*[0-9.]*/).*$//1/p`
case $ac_prog_version in
) ac_prog_version=”v. ?.??, bad”; ac_verc_fail=yes;;
3.[2-9]*|4.[0-3]*)
ac_prog_version=”$ac_prog_version, ok”; ac_verc_fail=no;;
*) ac_prog_version=”$ac_prog_version, bad”; ac_verc_fail=yes;;
这样就能够骗过configure ,持续编译下去。
可是修正的机遇要掌握好,要在 demo-arm9tdmi.sh解压完glibc-2.3.2后,运转其configure之前。我直接就将configure拷出来,修正后在crosstool解压完一切文件后直接掩盖源文件。
其实这种办法我在fedora9下运用crosstool时就用过,可是其时发现f9真是做得比f8差,前史的后退,所以就到回去用f8了,就没写文章总结。
(2)编译gcc-3.3.6的时分,呈现以下过错:
/usr/include/bits/fcntl2.h:51: error: call to __open_missing_mode declared with attribute error: open with O_CREAT in second argument needs 3 arguments
这纯属软件bug,由于运用open函数的时分,假如在第二个参数中运用了 O_CREAT,就有必要增加第三个参数:创立文件时赋予的初始权限。而在gcc-3.3.6/gcc/的collect2.c文件中有漏掉第三个参数的错 误,而gcc-4.3对语法过错的查看严厉是出了名的(4.1就不会因而过错退出),所以就退出了。
这也是能够处理的,便是在gcc-3.3.6/gcc/collect2.c中的第1575行改为:
redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT,0777);
我还发现glibc-2.3.2/login/tst-grantpt.c也有一个相似过错,一同改过来,除后患。第44行:
fd = open (file, O_RDWR | O_CREAT,0777);
修正的机遇也要掌握好,我是在crosstool解压完一切文件后和之前configure 文件一同直接掩盖源文件。
(3)阅历了以上的苦楚后,持续编译,会呈现以下过错:
* buffer overflow detected *: arm-9tdmi-linux-gnu-ar terminated
fuck!!!!!!!!编译出来的 arm-9tdmi-linux-gnu-ar底子没法用!被耍了!抛弃gcc-4.3.2!!!!!
要是哪位仁兄处理了以上问题,并编译成功,一定要告诉小弟啊!
(4)装置了gcc-4.1之后,从头编译。心想这回好了吧?!不想,有出了以下过错:
Infileincluded from version.c:33:
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating “character
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating” character
google后发现,原来是ubuntu将体系默许的shell设置成了dash (the Debian Almquist Shell),所以经过脚本生成的文件格局和bash的不一样,导致了编译过错。在运用了
ursa
的办法后问题处理。
sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh
(5)持续从头编译,在gcc做好后(此刻gcc已可用,仅仅gdb还没编译好),编译gdb的时分出了以下过错:
configure: error: no termcap library found
很显然,是由于没装一个库文件形成的,google后发现正解:用新立得装置libncurses5-dev(或是apt-get install libncurses5-dev)即可。
最终,编译成功,看到了盼望已久的“done”。