Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5154
  • 博文数量: 3
  • 博客积分: 130
  • 博客等级: 入伍新兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-03 11:27
文章分类

全部博文(3)

文章存档

2010年(3)

我的朋友
最近访客

分类: 嵌入式

2010-11-03 12:38:23

   写blog是个好的习惯,一方面能使学习到的内容加深印象且更有条理性,也方便于回顾,更是一种分享的精神。以前在这方面做的不足,想要弥补起来,于是新开了这个博客,并且从这篇文章开始。

   前段时间入手一个mini2440的开发板,主要是为了学习linux, 了解一些底层和内核的知识。
要学习嵌入式自然就需要用至交叉编译环境,虽然网上有编译好的现成的,但本着多了解细节的初衷开始自己编译。

一、前期准备
binutils-2.20.1           
glibc-2.12.1              
glibc-linuxthreads-2.5    
glibc-ports-2.9           
gcc-4.5.1                 
linux-2.6.35.8            

另gmp,mpfr,mpc需要提前安装,在此不作说明。

二、编译环境变量设置
1、新建env_setup, 内容如下:

export PROJECT=arm

export PRJROOT=/home/methus/${PROJECT}

export PREFIX=${PRJROOT}/cross-tools

export TARGET=arm-linux-gnueabi

export TARGET_PREFIX=${PREFIX}/${TARGET}

export PATH=${PATH}:${PREFIX}/bin


cd $PRJROOT


保存并使之生效。

$ . env_setup.sh


三、建立build目录

$mkdir -p build/{build-binutils,build-boot-gcc,build-glibc-header,build-glibc,build-gcc}

$cd build


四、安装内核头文件

$tar jxvf linux-2.6.35.8.tar.bz2

$cd linux-2.6.35.8

$make ARCH=arm headers_check

$make ARCH=arm INSTALL_HDR_PATH=$TARGET_PREFIX headers_install


五、安装binutils

$cd $PRJROOT/build

$tar jxvf binutils-2.20.1.tar.bz2

$cd build-binutils

$../binutils-2.20.1/configure --target=$TARGET --prefix=$PREFIX

$make && make install


六、安装glibc headers

$ cd $PRJROOT/build

$ tar jxvf glibc-2.12.1.tar.bz2 

//将glibc-linuxthreads和glibc-ports解压到glibc源码目录

$ cd glibc-2.12.1

$ tar jxvf glibc-linuxthreads-2.5.tar.bz2

$ tar jxvf glibc-ports-2.11.tar.bz2

$ mv glibc-ports-2.11 ports 


$ cd ../build-glibc-headers

$ ../glibc-2.12.1/configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=$TARGET_PREFIX/include

$ make cross-compiling=yes install_root=$TARGET_PREFIX prefix="" install-headers 


//生成两个空文件,后续编译glibc/gcc时会用到

$ touch $TARGET_PREFIX/include/gnu/stubs.h

$ touch $TARGET_PREFIX/include/bits/stdio_lim.h


七、GCC第一遍-引导编译器

$ cd $PRJROOT/build

$ cd build-boot-gcc

$ ../gcc-4.5.1/configure --target=$TARGET --prefix=$PREFIX --disable-shared --with-headers=$TARGET_PREFIX/include --with-newlib --enable-languages=c

$ make all-gcc

$ make install-gcc

$ make all-target-libgcc

$ make install-target-libgcc


八、glibc安装

1、创建config.cache文件

$ cd $PRJROOT/build
$ cd cd build-glibc

$ echo "libc_cv_forced_unwind=yes" > config.cache
$ echo "libc_cv_c_cleanup=yes" >> config.cache
$ echo "libc_cv_arm_tls=yes" >> config.cache

强制打开unwind和tls,避免出现发下错误

configure: error: forced unwind support is required

创建libgcc_eh.a链接,避免后续因无该文件而出现编译错误
$ cd $PREFIX/lib/gcc/arm-linux-gnueabi/4.5.1
$ ln -s libgcc.a libgcc_eh.a

2、正式开始编译

$ cd $PRJROOT/build/build-gcc

$ CC=arm-linux-gnueabi-gcc ../glibc-2.12.1/configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=$PREFIX/include --cache-file=config.cache

$ make


编译过程中出现如下错误时:

../ports/sysdeps/arm/dl-machine.h:29:0: warning: "VALID_ELF_ABIVERSION" redefined

../sysdeps/unix/sysv/linux/ldsodefs.h:62:0: note: this is the location of the previous definition

../ports/sysdeps/arm/dl-machine.h:30:0: warning: "VALID_ELF_OSABI" redefined


修改../glibc-2.12.1/ports/sysdeps/arm/dl-machine.h中

#define VALID_ELF_ABIVERSION(ver) (ver == 0)

#define VALID_ELF_OSABI(osabi) \

    (osabi == ELFOSABI_SYSV || osabi == ELFOSABI_ARM)

#define VALID_ELF_HEADER(hdr,exp,size) \

    memcmp (hdr,exp,size-2) == 0 \

    && VALID_ELF_OSABI (hdr[EI_OSABI]) \

    && VALID_ELF_ABIVERSION (hdr[EI_ABIVERSION])




#ifndef VALID_ELF_ABIVERSION
#define VALID_ELF_ABIVERSION(ver)       (ver == 0)
#endif

#ifndef VALID_ELF_OSABI
#define VALID_ELF_OSABI(osabi) \
  (osabi == ELFOSABI_SYSV || osabi == ELFOSABI_ARM)
#endif

#ifndef VALID_ELF_HEADER
#define VALID_ELF_HEADER(hdr,exp,size) \
  memcmp (hdr,exp,size-2) == 0 \
  && VALID_ELF_OSABI (hdr[EI_OSABI]) \
  && VALID_ELF_ABIVERSION (hdr[EI_ABIVERSION])
#endif


最后安装glibc库文件及修改新产生的libc.so文件中绝对路径,使之使用新编译好的目标板库文件。

$ make install_root=$TARGET_PREFIX prefix="" install

$ sed -i 's|/lib/||g' $TARGET_RREFIX/lib/libc.so


九、gcc第二遍-完整编译器安装

$ cd $PRJROOT/build/build-gcc

$ ../gcc-4.5.1/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --disable-libgomp


  --disable-libgomp  不编译libgomp库,解决编译过程中出现的如下错误

Pthreads are required to build libgomp

 
  编译安装

$ make all

$ make install



至此,交叉编译工具已编译安装完毕,另本还有一个设置工具链的步骤, 但通过arm-linux-gnueabi-gcc --print-search-dirs 查看我的programs路径中,是能够搜索到as,gcc等工具的位置,索性不挪了。

编译过程中的一些联想问题:
1、EABI是什么?
2、arm-linux-gnueabi和arm-none-linux-eabi等目标板类型有何区别?
阅读(588) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:gentoo安装ibus后的小红叉

给主人留下些什么吧!~~