自己制作arm-linux交叉编译环境(一)-scratch篇

       交叉编译是指在一台电脑上来编译另一种结构的电脑上的代码,编译生成的程序不是运行在本机上的,而是另一种结构的机子上(^_^,快晕了...),打个比方吧,比如我的系统是x86结构的,如果我需要编译一个arm结构的程序,那编译器等就都要重新弄过了,这个编译过程就叫做 交叉编译,在嵌入式开发中就必须要交叉编译,在开发主机x386上开发arm目标机上可以运行的代码

     在<<嵌入式linux系统开发技术详解-基于arm>>这本书中,有一章是将怎样制作自己的交叉编译环境的,不过用的是gcc2.95,很早以前的东西了,而且不能编译linux.2.6的内核,为了锻炼自己,我就打算自己编译下,在网上一搜索,都是差不多的文章,比如 一步步制作自己的交叉编译环境,等,但版本都比较低,我想用最新的版本来编译,经过几天的google,发现个crosstool比较好用,只要稍微改动下就能自动编译,目前最新版本为0.43,最高支持gcc-4.1.1-glibc-2.3.6,下载地址为:
http://kegel.com/crosstool/crosstool-0.43.tar.gz
还有个LFS工程,这个工程是教会大家怎样从代码制作自己的小linux系统的,主页为http://www.linuxfromscratch.org/ ,这个工程包含很多小工程,其中的CFLS是专门为跨平台用的(Cross Linux From Scratch) ,clfs sysroot 是用来测试新的编译方法的,SVN版本已经包含了对最新软件包的支持
BOOK下载地址为: http://cross-lfs.org/files/BOOK/
编译的时候用到的补丁包 : http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-sysroot/patches/
编译用的软件包: http://cross-lfs.org/files/packages/sysroot-0.0.1/


由于编译过程复杂,又可能碰到一些莫名其妙的错误,所以最好还是用别人已经弄好的
http://opensrc.sec.samsung.com/download/arm-elf-tools-20040427.sh (arm-elf-toolchain)
http://www.handhelds.org/download/projects/toolchain/(arm-linux-toolchain)

强烈建议编译的过程中边编译边看clfs-sysroot文档中的cross-compier tool,也就是第5章,因为我是新手,不能保证编译的过程中会没有错误,或者编译后无法使用等等,所以.......

0:准备好所要用到的资料和其他准备工作

   1). 首页要准备好编译用的软件包:
      
    binutils-2.17.tar.bz2         http://ftp.gnu.org/gnu/binutils/binutils-2.17.tar.bz2
    gcc-4.1.1-tar.bz2             http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2
    glibc-2.5.tar.bz2              http://ftp.gnu.org/gnu/glibc/glibc-2.5.tar.bz2
    glibc-ports-2.5.tar.bz2     http://ftp.gnu.org/gnu/glibc/glibc-ports-2.5.tar.bz2
    gdb-6.6.tar.bz2               http://ftp.gnu.org/gnu/gdb/gdb-6.6.tar.bz2
    linux-header-2.6.20-rc4   http://www.kernel.org/pub/linux/kernel/v2.6/(补丁自己打)

   2). 编译过程中用到的补丁:
      
      在 http://cross-lfs.org/files/packages/sysroot-0.0.1/里面找到gcc-4.1.1,binutils-2.17,glibc-2.5的        补丁全部下回来放到patches文件夹里面

    3).编译过程的指导文件:
        http://cross-lfs.org/files/BOOK/ 找到CLFS-SYSROOT-SVN....样式的包,解压后查看arm目录

    4).整个编译过程的工作目录:
         
          mkdir crosstool
          cd   crosstool
          mkdir linux-2.6.x
          mkdir patches
          mkdir src

          linux-2.6.x存放要用到的内核头文件,patches存放需要的补丁,src存放要用到的软件包

          PS:编译完成后的文件将安装到 ~/arm-linux上
    5).设置一些环境变量

        export CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo ${MACHTYPE} | cut -d-             -f2)/cross/")"
        #export CLFS_TARGET="arm-unknown-linux-gnu"
        export CLFS_TARGET="arm-linux"
        export CLFS=~/arm-linux
        export PATH=$CLFS/bin:$CLFS/cross-tools/bin:$PATH
        unset CFLAGS
        unset CXXFLAGS
       
        新建头文件存放地址
        install -dv $CLFS/include
        install -dv $CLFS/usr
        install -dv $CLFS/usr/include

    6). 安装一些可能需要的软件包:

        sudo apt-get install bison flex texinfo

1. 安装内核头文件:

    新建保存头文件的目录,并生成linux/version.h文件指示内核版本,如果缺少这个文件后面编译会出错
   
  install  - dv ${CLFS} / usr / include
  cd linux-2.6.x

  make include/linux/version.h

    复制必要的头文件和与体系结构(arm)相关的头文件

   
    install 
- dv ${CLFS} / usr / include
    cp 
- av include / {asm - generic,linux,mtd,scsi,sound} ${CLFS} / usr / includecp -av
    include/asm-arm ${CLFS}/usr/include/asm

  
2. 编译binutils-2.17:

    解压binutils后,进入代码目录,打上必要的补丁:

cd src
tar jxvf binutils
- 2.17 .tar.bz2
cd binutils
- 2.17

patch 
- Np1  - i .. / .. / patches / binutils - 2.17 - posix - 1 .patch
patch 
- Np1  - i .. / .. / patches / binutils - 2.17 - branch_update - 1 .patch

    创建编译目录:

mkdir  - v .. / binutils - build
cd ..
/ binutils - build

    配置configure:

   .. / binutils - 2.17 / configure  -- prefix = $ {CLFS} / cross - tools 
    
-- host = $ {CLFS_HOST}   -- target = $ {CLFS_TARGET}   -- with - sysroot = $ {CLFS}  
  -- disable - nls  -- enable - shared  -- disable - multilib

    编译binutils:
      
make configure - host
make

     安装binutils到 $ {CLFS} / cross - tools:

   make install

     打开~/arm-linux/cross-tools/bin,就会发现生成了好多arm-linux-开头的文件

     以后会用到这个头文件,所以安装到include:

   cp  - v .. / binutils - 2.17 / include / libiberty.h $ {CLFS} / usr / include


3. 安装 glibc的头文件到内核头文件中:
   
    编译glibc的时候需要glibc的头文件,所以要复制到内核头文件夹中
 

    tar jxvf ../glibc-2.5.tar.bz2
    cd ../glibc-2.5

    去处glibc的gcc 3.4.x依赖

  cp configure{,.orig}
sed -e 's/3.4/3.[0-9]/g' configure.orig > configure

    安装glibc的arm支持:

    tar  - jxvf .. / glibc - ports - 2.5 .tar.bz2
    mv 
- v glibc - ports - 2.5  ports

   新建编译目录:

    mkdir  - v .. / glibc - build
    cd ..
/ glibc - build

    添加NPTL线程库支持:

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

   指定安装路径:

    cho  " install_root=${CLFS} "   >  configparms

    配置configure :

    CC = gcc .. / glibc - 2.5 / configure  -- prefix =/ usr 
   
    -- host = ${CLFS_TARGET}  -- build = ${CLFS_HOST} 
   
    -- with - headers = ${CLFS} / usr / include  -- cache - file = config.cache

    安装glibc头文件:

    make install - headers

    cp 
- v bits / stdio_lim.h ${CLFS} / usr / include / bits
    touch ${CLFS}
/ usr / include / gnu / stubs.h
    cp 
- v .. / glibc - 2.5 / ports / sysdeps / unix / sysv / linux / arm / nptl / bits / pthreadtypes.h 
    ${CLFS}
/ usr / include / bits

4. 编译静态的gcc(不带glibc),用来编译glibc
   
    tar jxvf .. / gcc - 4.1 . 1 .tar.bz2
    cd ..
/ gcc - 4.1 . 1
   
    打上补丁:
 
 
patch  - Np1  - i .. / gcc - 4.1 . 1 - posix - 1 .patch
patch 
- Np1  - i .. / gcc - 4.1 . 1 - cross_search_paths - 1 .patch

新建编译目录:

mkdir  - v .. / gcc - build
cd ..
/ gcc - build

配置configure:

.. / gcc - 4.1 . 1 / configure  -- prefix = $ {CLFS} / cross - tools 
    
-- host = $ {CLFS_HOST}   -- target = $ {CLFS_TARGET}   -- disable - multilib 
    
-- with - sysroot = $ {CLFS}   -- disable - nls  -- disable - shared 
   
-- enable - languages = c

编译安装gcc-static:

make all - gcc
make install
- gcc
5. 编译安装glibc:

    解压补丁并打上补丁:

    tar jxvf .. / glibc - 2.5 .tar.bz2
    cd ..
/ glibc - 2.5

    tar 
- jxvf .. / glibc - ports - 2.5 .tar.bz2
    mv 
- v glibc - ports - 2.5  ports

    patch 
- Np1  - i .. / glibc - 2.5 - libgcc_eh - 2 .patch
    patch 
- Np1  - i .. / glibc - 2.5 - localedef_segfault - 1 .patch
    patch 
- Np1  - i .. / glibc - 2.5 - cross_hacks - 2 .patch
    patch 
- Np1  - i .. / glibc - 2.5 - branch_update - 1 .patch

  编译并安装:

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

echo 
" install_root=${CLFS} "   >  configparms

BUILD_CC
= " gcc "  CC = " ${CLFS_TARGET}-gcc "  
     AR
= " ${CLFS_TARGET}-ar "  RANLIB = " ${CLFS_TARGET}-ranlib "  
     ..
/ glibc - 2.5 / configure  -- prefix =/ usr  -- libexecdir =/ usr / lib / glibc 
    
-- host = ${CLFS_TARGET}  -- build = ${CLFS_HOST} 
    
-- disable - profile  -- enable - add - ons 
    
-- with - tls  -- enable - kernel = 2.6 . 0   -- with - __thread 
    
-- with - binutils = ${CLFS} / cross - tools / bin  -- with - headers = ${CLFS} / usr / include 
    
-- cache - file = config.cache

make
make install

    本来还有个国际化支持的,我这里运行不过来,要自己运行的可以看clfs-sysroot

    配置glibc:

    cat  >  ${CLFS} / etc / nsswitch.conf  <<   " EOF "
    # Begin 
/ etc / nsswitch.conf

    passwd: files
    group: files
    shadow: files

    hosts: files dns
    networks: files

    protocols: files
    services: files
    ethers: files
    rpc: files

    # End 
/ etc / nsswitch.conf
    EOF

    配置glibc的动态装载:

    cat  >  ${CLFS} / etc / ld.so.conf  <<   " EOF "
    # Begin 
/ etc / ld.so.conf

    / usr / local / lib
    / opt / lib

    # End 
/ etc / ld.so.conf
    EOF

7. 完全安装gcc

    打上个GCC的补丁:
   
    cd .. / gcc - 4.1 . 1

    patch 
- Np1  - i .. / gcc - 4.1 . 1 - posix - 1 .patch
    patch 
- Np1  - i .. / gcc - 4.1 . 1 - PR20425 - 1 .patch
    patch 
- Np1  - i .. / gcc - 4.1 . 1 - cross_search_paths - 1 .patch

    配置Configure:

    mkdir  - v .. / gcc - build
    cd ..
/ gcc - build

    ..
/ gcc - 4.1 . 1 / configure  -- prefix = ${CLFS} / cross - tools 
       
-- host = ${CLFS_HOST}  -- target = ${CLFS_TARGET}  -- disable - multilib 
       
-- with - sysroot = ${CLFS}  -- disable - nls  -- enable - shared 
       
-- enable - languages = c,c ++   -- enable - __cxa_atexit 
       
-- enable - c99  -- enable - long - long   -- enable - threads = posix

    编译安装gcc:

    make 
    make install


8. 打包压缩arm-linux-toolchains (我打包的时候老出问题,郁闷)

    tar cvjf  / tmp / arm - linux - toolchains.tar.bz2  /
                cross
- tools / arm - linux /
                cross
- tools / bin / arm - linux -* /
                cross
- tools / bin / genext2fs  /
                cross
- tools / include / c ++/ 4.1 . 1 /
                cross
- tools / lib / gcc / arm - linux / 4.1 . 1/
                cross
- tools / libexec / gcc / arm - linux / 4.1 . 1


注意:
编译好的arm-linux工具链未经过测试,只是用来学习怎样编译自己的交叉工具链,请不要用于任何实际的开发和使用,更不要用于商业产品中,
也不要用于学习arm,以免出错,出错后会很烦的



参考资料:
    1. HOWTO build arm-linux toolchain for ARM/XSCALE  (build-arm-linux-4.1)
    2.clfs-sysroot book for arm
    3. 使用gcc 4.1.1 glibc 2.5 kernel 2.6.19 创建arm 交叉工具链
    4. arm-linux建立交叉编译工具链的过程

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值