一直做的是應用項目,不知道怎麼的,突然想把整個arm-linux移植流程跑一遍,如今就有了這一記錄,希望對初學和有興趣了解的人做些參考,同時還望行家們手下留情我,並多多指教。閒話少說,進入正題:第一步交叉工具鏈的制作。
先說明我這裡僅是對binutils、gcc、glibc的交叉編譯,缺少gdb等以及對整個制作完成的打包整理,可能有些混亂。編譯環境是Debian 6.0,使用的頭文件內核linux2.6.32,編譯是帶EABI的,在交叉工具鏈編譯(上)中主要將制作過程一介紹,在下中將說明原因、遇到的些錯誤及解決方法。
(1)准備工作
源碼包:
- gmp-4.3.2.tar.gz ftp://ftp.gnu.org/gnu/gmp
- mpfr-3.0.1.tar.gz ftp://ftp.gnu.org/gnu/mpfr
- glibc-ports-2.11.tar.bz2 ftp://ftp.gnu.org/gnu/glibc
- binutils-2.18.tar.bz2 ftp://ftp.gnu.org/gnu/binutils
- gcc-4.4.5.tar.gz ftp://ftp.gnu.org/gnu/gcc
- 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上不去,只好從這裡下了。
安裝一些必備的東西
- aptitude install build-essential automake bison flex texinfo gawk g\+\+
- aptitude remove mawk
- 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 安裝目錄
設置環境變量
- export TARGET=arm-none-linux-gnueabi
- export PREFIX=/opt/arm_linux/tools
- export PATH=$PATH:$PREFIX/bin
安裝gmp、mpfr
gmp
- tar xvf gmp-4.3.2.tar.gz 在gmp安裝目錄下
- ./configure --prefix=$PREFIX
- make
- make check
- make install
mpfr
- ./configure --prefix=$PREFIX --enable-shared --with-gmp=$PREFIX
- make
- make check
(2)編譯binutils
解壓源碼包到build-binutils,建立編譯文件夾
- makdir build
- ./configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-multilib --enable-shared
- make configure-host
- make
- make install
(3)生成內核頭文件
在解壓好的目錄下
配置
- make ARCH=arm COROSS_COMPILE=arm-linux- menuconfig
- make ARCH=arm COROSS_COMPILE=arm-linux-
----不管錯誤,只是生成需要的頭文件
建立include及鏈接
- mkdir -p $PREFIX/include
- cd $PREFIX/include
- ln -s /opt/arm_linux/kernel/linux-2.6.32/arch/arm/include/asm asm
- ln -s /opt/arm_linux/kernel/linux-2.6.32/include/linux linux
- ln -s /opt/arm_linux/kernel/linux-2.6.32/include/asm-generic asm-generic
(4)初編譯gcc
配置
----不能在源碼解壓的目錄下直接編譯,可以在其目錄下新建一個文件夾
- mkdir build
- ../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
- make all-gcc all-target-libgcc
- make install-gcc install-target-libgcc
(5)編譯c庫
配置
----不能在源碼解壓的目錄下直接編譯,可以在其目錄下新建一個文件夾
- mkdir build
- cd build
- 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
編譯
- cd $PREFIX/lib/gcc/$TARGET/4.4.5
- ln -s libgcc.a libgcc_eh.a
- make make PREFIX=/opt/arm_linux install
(6)第二次編譯gcc
修正
- cd $PREFIX/arm-none-linux-gnueabi
- rm lib include -rf
- ln -s ../lib lib
- ln -s ../include include
配置
- cd $PREFIX/arm-none-linux-gnueabi
- rm lib include -rf
- ln -s ../lib lib
- ln -s ../include include
7.測試
可以直接寫個helloworld,用arm-none-linux-gnueabi-gcc編譯一下,然後使用file命令查看其屬性,我這裡是把mini2440提供的內核解壓,然後將makefile中的cross-compile的arm-linux-換成現在的arm-none-linux-gnueabi-,make zImage,找到內核下載到板子上,部分信息如下:
- load Image of Linux...Uncompressing Linux................................................................................................................................................................. done, booting the kernel.
- Linux version 2.6.32.2-FriendlyARM (root@debian6) (gcc version 4.4.5 (GCC) ) #2 Fri Sep 23 17:09:08 CST 2011
- CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
- CPU: VIVT data cache, VIVT instruction cache
- Machine: FriendlyARM Mini2440 development board
- ATAG_INITRD is deprecated; please update your bootloader.
- Memory policy: ECC disabled, Data cache writeback
- 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