歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

arm_linux移植手記:交叉工具鏈編譯

    一直做的是應用項目,不知道怎麼的,突然想把整個arm-linux移植流程跑一遍,如今就有了這一記錄,希望對初學和有興趣了解的人做些參考,同時還望行家們手下留情我,並多多指教。閒話少說,進入正題:第一步交叉工具鏈的制作。

    先說明我這裡僅是對binutils、gcc、glibc的交叉編譯,缺少gdb等以及對整個制作完成的打包整理,可能有些混亂。編譯環境是Debian 6.0,使用的頭文件內核linux2.6.32,編譯是帶EABI的,在交叉工具鏈編譯(上)中主要將制作過程一介紹,在下中將說明原因、遇到的些錯誤及解決方法。

(1)准備工作
  源碼包:
 
  1. gmp-4.3.2.tar.gz              ftp://ftp.gnu.org/gnu/gmp  
  2. mpfr-3.0.1.tar.gz             ftp://ftp.gnu.org/gnu/mpfr  
  3. glibc-ports-2.11.tar.bz2      ftp://ftp.gnu.org/gnu/glibc  
  4. binutils-2.18.tar.bz2         ftp://ftp.gnu.org/gnu/binutils  
  5. gcc-4.4.5.tar.gz              ftp://ftp.gnu.org/gnu/gcc  
  6. glibc-2.11.1.tar.bz2          ftp://ftp.gnu.org/gnu/gcc  

linux-2.6.32.tar.bz2          http://download.chinaunix.net/download.php?id=31468&ResourceID=6156

----最近kernel.org上不去,只好從這裡下了。

安裝一些必備的東西

  1. aptitude install build-essential automake bison flex texinfo gawk g\+\+    
  2. aptitude remove mawk   
  3. apt-get install libncurses*  
  目錄
  build-tools                 存放源碼及編譯文件夾
    --build-binutils        binutils
    --build-gcc               gcc
    --build-glibc             glibc
    --build-required      gmp、mpfr、glibc-ports
    --build-gcc-final      最後的gcc 

  kernel                      linux內核源碼,包括下載的沒有修改過的和

                                   測試使用的是mini2440提供的內核linux2.6.32.2

  tools                           安裝目錄
  設置環境變量  
  1. export TARGET=arm-none-linux-gnueabi  
  2. export PREFIX=/opt/arm_linux/tools  
  3. export PATH=$PATH:$PREFIX/bin  

  安裝gmp、mpfr

gmp

 
  1. tar xvf gmp-4.3.2.tar.gz 在gmp安裝目錄下   
  2. ./configure --prefix=$PREFIX       
  3. make     
  4. make check       
  5. make install  
  mpfr  
 
  1. ./configure --prefix=$PREFIX --enable-shared --with-gmp=$PREFIX         
  2. make        
  3. make check  
(2)編譯binutils
 解壓源碼包到build-binutils,建立編譯文件夾
  1. makdir build  
  2. ./configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-multilib --enable-shared  
  3. make configure-host  
  4. make             
  5. make install  
(3)生成內核頭文件
 在解壓好的目錄下
 配置
  1. make ARCH=arm COROSS_COMPILE=arm-linux- menuconfig  
  2. make ARCH=arm COROSS_COMPILE=arm-linux-   
 ----不管錯誤,只是生成需要的頭文件
 建立include及鏈接
  1. mkdir -p $PREFIX/include  
  2. cd $PREFIX/include  
  3. ln -s /opt/arm_linux/kernel/linux-2.6.32/arch/arm/include/asm asm  
  4. ln -s /opt/arm_linux/kernel/linux-2.6.32/include/linux  linux  
  5. ln -s /opt/arm_linux/kernel/linux-2.6.32/include/asm-generic asm-generic  
(4)初編譯gcc
 配置 
 ----不能在源碼解壓的目錄下直接編譯,可以在其目錄下新建一個文件夾
  1. mkdir build  
  2. ../configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-shared --with-mpfr=$PREFIX --with-gmp=$PREFIX --without-headers --with-newlib --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-threads --enable-languages=c --disable-multilib --with-abi=aapcs  
  3. make all-gcc all-target-libgcc  
  4. make install-gcc install-target-libgcc  
(5)編譯c庫
 配置
 ----不能在源碼解壓的目錄下直接編譯,可以在其目錄下新建一個文件夾
  1. mkdir build  
  2. cd build  
  3. CC=$TARGET-gcc ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons --with-binutils=$PREFIX/bin --with-headers=$PREFIX/include   libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes  
編譯
  1. cd $PREFIX/lib/gcc/$TARGET/4.4.5   
  2. ln -s libgcc.a libgcc_eh.a   
  3. make       make PREFIX=/opt/arm_linux install  
(6)第二次編譯gcc
  修正
  1. cd $PREFIX/arm-none-linux-gnueabi    
  2. rm lib include -rf    
  3. ln -s ../lib lib    
  4. ln -s ../include include  

  配置

  1. cd $PREFIX/arm-none-linux-gnueabi    
  2. rm lib include -rf    
  3. ln -s ../lib lib    
  4. ln -s ../include include  
7.測試  
  可以直接寫個helloworld,用arm-none-linux-gnueabi-gcc編譯一下,然後使用file命令查看其屬性,我這裡是把mini2440提供的內核解壓,然後將makefile中的cross-compile的arm-linux-換成現在的arm-none-linux-gnueabi-,make zImage,找到內核下載到板子上,部分信息如下:
  1. load Image of Linux...Uncompressing Linux................................................................................................................................................................. done, booting the kernel.  
  2. Linux version 2.6.32.2-FriendlyARM (root@debian6) (gcc version 4.4.5 (GCC) ) #2 Fri Sep 23 17:09:08 CST 2011  
  3. CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177  
  4. CPU: VIVT data cache, VIVT instruction cache  
  5. Machine: FriendlyARM Mini2440 development board  
  6. ATAG_INITRD is deprecated; please update your bootloader.  
  7. Memory policy: ECC disabled, Data cache writeback  
  8. CPU S3C2440A (id 0x32440001)  

好了,只要按著做,應該就有自己的編譯器了,不過很多配置我現在也不太清楚,主要就是參考下面的文章,以及碰到錯誤搜索下了。別急,下一頁(http://www.linuxidc.com/Linux/2011-09/43795p2.htm)會簡單看下碰到什麼問題以及怎樣解決的。

參考:

交叉工具鏈制作至尊寶典 http://www.linuxidc.com/Linux/2011-09/43796.htm

如何為嵌入式開發建立交叉編譯環境 http://www.linuxidc.com/Linux/2011-09/43797.htm

自己動手制作交叉編譯工具鏈 http://www.linuxidc.com/Linux/2011-09/43798.htm

 

Copyright © Linux教程網 All Rights Reserved