现在的位置: 首页 > 综合 > 正文

建立交叉编译器 for arm (binutils-2.17 gcc-3.4.6 glibc-2.3.6)

2012年07月27日 ⁄ 综合 ⁄ 共 7864字 ⁄ 字号 评论关闭

 

交叉编译器建立过程
 
准备工作
下载一下源码包:
可以到ftp://ftp.gnu.org 下载源码包binutils-2.17.tar.gz gcc-3.4.6.tar.gz glibc-2.3.6.tar.gz glibc-linuxthreads-2.3.6.tar.gz 或者到ftp://sourceware.org/pub/下载。
将源码包放入/home/zht/cross-compiler/build-tools/目录下。
可以到http://sources.gentoo.org/viewcvs.py/gentoo/src/patchsets/下载相关源码包的补丁文件。将补丁文件放入/home/zht/cross-compiler/build-tools/patch目录中。
 
准备内核源代码包:linux-2.4.27.tar.gz patch-2.4.27-vrs1 2.4.27vrs1-at91-17032005.patch
在目录/home/zht/cross-compiler/kernel目录下准备好目标板内核源码,并配置编译。
 
1 准备内核头文件
# cd /home/zht/cross-compiler/
# mkdir -p /usr/loca/arm/arm-linux/include
# cp -r kernel/linux-2.4.27/include/linux/ /usr/local/arm/arm-linux/include/
# cp -r kernel/linux-2.4.27/include/asm-arm/ /usr/local/arm/arm-linux/include/asm
# cp -r kernel/linux-2.4.27/include/asm-generic/ /usr/local/arm/arm-linux/include
2 binutils的设置
# cd build-tools/
# mkdir build-binutils
# tar zxvf binutils-2.17.tar.gz
# cd build-binutils/
# ../binutils-2.17/configure --target=arm-linux --prefix=/usr/local/arm
# make
# make install
查看一下:# ls /usr/local/arm/bin/
 
设置环境变量

#export PATH=$PATH:/usr/local/arm/bin
 
2 引导编译器的设置
① 为引导编译器准备glibc头文件(参见2 p130)
# cd cd /home/zht/cross-compiler/ build-tools/
# tar zxvf glibc-2.3.6.tar.gz
# tar zxvf glibc-linuxthreads-2.3.6.tar.gz --directory=glibc-2.3.6
# mkdir build-glibc-headers
# cd build-glibc-headers
# ../glibc-2.3.6/configure --host=arm-linux --prefix="/usr" --enable-add-ons=linuxthreads --with-headers=/usr/local/arm/arm-linux/include/
# make cross-compiling=yes install_root=/usr/local/arm/arm-linux/ prefix="" install-headers
# touch /usr/local/arm/arm-linux/include/gnu/stubs.h
# touch /usr/local/arm/arm-linux/include/bits/stdio_lim.h
 
② 建立引导成序gcc编译器
# cd cd /home/zht/cross-compiler/ build-tools/
# tar zxvf gcc-3.4.6.tar.gz
# patch -p1 -d gcc-3.4.6 < patch/gcc-3.4.6-patches-1.2/patch/33_all_pr15068-fix.patch
(为什么?可以在网上找到原因,33_all_pr15068-fix.patch中也有说明,若不打该补丁再编译glibc时将出错)。
# mkdir build-boot-gcc
# cd build-boot-gcc
#../gcc-3.4.6/configure --target=arm-linux --prefix=/usr/local/arm/ --disable-shared --with-headers=/usr/local/arm/arm-linux/include/ --with-newlib --enable-language=c
# make all-gcc
# make install-gcc
 
查看: # ls /usr/local/arm/bin
 
3 C链接库glibc的设置
# cd /home/zht/cross-compiler/ build-tools/
# mkdir build-glibc
# cd build-glibc
# CC=arm-linux-gcc ../glibc-2.3.6/configure --host=arm-linux --build=i686-pc-linux --prefix="/usr" --enable-add-ons=linuxthreads --with-headers=/usr/local/arm/arm-linux/include/
以下是需要的补丁文件,详情见附录1,编译glibc出现错误的解决办法,或者见参考1。补丁文件可以到http://sources.gentoo.org/viewcvs.py/gentoo/src/patchsets/下载。
# patch -p0 -d glibc-2.3.6 < patch/glibc-patches/5090_all_divdi3-asm-fix.patch
# patch -p1 -d glibc-2.3.6 < patch/glibc-patches/6200_all_arm-glibc-2.3.4-ioperm.patch
# patch -p1 -d glibc-2.3.6 < patch/glibc-patches/6230_all_arm-glibc-2.3.6-socket-no-weak-lias.patch
# patch -p1 -d glibc-2.3.6 < patch/glibc-patches/gcc_eh.patch.cross
 
开始编译
# make
# make install_root=/usr/local/arm/arm-linux prefix="" install
 
配置libc.so文件
# vi /usr/local/arm/arm-linux/lib/libc.so
将GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a )
改为:GROUP ( libc.so.6 libc_nonshared.a )
 
配置libpthread.so文件
# vi /usr/local/arm/arm-linux/lib/libpthread.so
将GROUP ( /lib/libpthread.so.0 /lib/libpthread_nonshared.a )
改为:GROUP ( libpthread.so.0 libpthread_nonshared.a )
 
 
4 完整编译器的设置
# cd /home/zht/cross-compiler/ build-tools/
# mkdir build-gcc
# cd build-gcc
 
如果要求gcc支持多种编程语言配置如下:
#../gcc-3.4.6/configure --target=arm-linux --host=i686-pc-linux --prefix=/usr/local/arm --enable-threads=posix
如果要求gcc仅支持C和C++编程语言配置如下:
#../gcc-3.4.6/configure --target=arm-linux --host=i686-pc-linux --prefix=/usr/local/arm --enable-threads=posix --enable-languages=c,c++
# make all
# make install
 
5 重复3重新编译glibc
 
6 根据参考2,作如下设置

# cd /usr/local/arm/arm-linux/bin
# mv as ar gcc ld nm ranlib strip /usr/local/arm/lib/gcc/arm-linux/3.4.6
# for file in as ar gcc ld nm ranlib strip
> do
> ln –s /usr/local/arm/lib/gcc/arm-linux/3.4.6/$file .
> done
 
7 利用建立的交叉编译器编译内核(编译linux-2.4.27-vrs1)
 
错误及处理
1 cc1: error: invalid option `short-load-bytes'
处理:将 arch/arm/Makefile中的
CFLAGS_BOOT     :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm
CFLAGS          +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float –Uarm
改为:
CFLAGS_BOOT    :=$(apcs-y) $(arch-y) $(tune-y) -malignment-traps -msoft-float -Uarm
CFLAGS         +=$(apcs-y) $(arch-y) $(tune-y) -malignment-traps -msoft-float –Uarm
 
2 at91_serial.c: In function `at91_register_uart':
at91_serial.c:654: error: syntax error before "__FUNCTION__"
at91_serial.c:691: error: syntax error before "__FUNCTION__"
处理:将drivers/at91/serial/at91_serial.c中的
printk(KERN_ERR __FUNCTION__ ": bad index number %d/n", idx);
改为:printk(KERN_ERR "%s:bad index number %d/n",__FUNCTION__ ,idx);
 
将printk(KERN_ERR __FUNCTION__ ": bad port number %d/n", port);
改为:printk(KERN_ERR "%s:bad port number %d/n",__FUNCTION__ ,port);
 
3   keyboard.c: In function `kbd_processkeycode':
keyboard.c:413: error: label at end of compound statement
keyboard.c: In function `do_fn':
处理如下:
将drivers/char/keyboard.c 中 413行的
#endif
                }
        }      
        rep = 0;
out:   
 
改为:
#endif
                }
        }      
        rep = 0;
out:   
    rep=rep;
 
4 /home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/linux/sched.h:766: sorry, unimplemented: inlining failed in call to '__mmdrop': function body not available
sched.c:771: sorry, unimplemented: called from here
处理如下:
将 include/linux/sched.h中 line766
extern inline void FASTCALL(__mmdrop(struct mm_struct *));
改为:
extern void FASTCALL(__mmdrop(struct mm_struct *));
 
5 /home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/linux/blkdev.h:236: sorry, unimplemented: inlining failed in call to 'blk_get_queue': function body not available
blkpg.c:264: sorry, unimplemented: called from here
/home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/linux/blkdev.h:236: sorry, unimplemented: inlining failed in call to 'blk_get_queue': function body not available
blkpg.c:267: sorry, unimplemented: called from here
 
处理如下:
将include/linux/blkdev.h 中line236
extern inline request_queue_t *blk_get_queue(kdev_t dev);
改为:extern request_queue_t *blk_get_queue(kdev_t dev);
 
6
/home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/net/ip.h:140: sorry, unimplemented: inlining failed in call to 'ip_finish_output': function body not available
ip_forward.c:165: sorry, unimplemented: called from here
处理如下:
将include/net/ip.h中line140的
extern __inline__ int ip_finish_output(struct sk_buff *skb);
改为:extern int ip_finish_output(struct sk_buff *skb);
 
 
 
 
『附录1』建立交叉编译器时出现的错误及解决办法
1编译glibc

① /tmp/ccqiZHcQ.s: Assembler messages:
/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__divdi3_internal'
/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__udivdi3_internal'
/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__moddi3_internal'
/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__umoddi3_internal'
make[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/csu/divdi3.os] Error 1
到网上学找补丁5090_all_divdi3-asm-fix.patch 并打入glibc中。
 
② make[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/misc/ioperm.o] Error 1
make[2]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6/misc'
make[1]: *** [misc/subdir_lib] Error 2
make[1]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6'
make: *** [all] Error 2
到网上学找补丁6200_all_arm-glibc-2.3.4-ioperm.patch 并打入glibc中。
 
③ ../sysdeps/unix/sysv/linux/bind.S: Assembler messages:
../sysdeps/unix/sysv/linux/bind.S:5: Error: symbol `__bind' is already defined
make[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/socket/bind.o] Error 1
make[2]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6/socket'
make[1]: *** [socket/subdir_lib] Error 2
到网上学找补丁6230_all_arm-glibc-2.3.6-socket-no-weak-alias.patch 并打入glibc中。
 
/usr/local/arm/bin/../lib/gcc/arm-linux/3.4.6/../../../../arm-linux/bin/ld: cannot find -lgcc_eh
collect2: ld returned 1 exit status
make[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/iconv/iconvconfig] Error 1
make[2]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6/iconv'
make[1]: *** [iconv/others] Error 2
make[1]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6'
make: *** [all] Error 2
到网上学找补丁gcc_eh.patch.cross 并打入glibc中。或者见参考1
 
 
 
参考:
2 构建嵌入式linux系统 KARIM YAGHMOUR 著

 

抱歉!评论已关闭.