歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> arm_linux移植手記:交叉工具鏈編譯

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

日期:2017/3/1 11:17:53   编辑: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