arm_linux移植手记:交叉工具链编译
arm_linux移植手记:交叉工具链编译
一直做的是应用项目,不知道怎么的,突然想把整个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
- ./configure --prefix=$PREFIX --enable-shared --with-gmp=$PREFIX
- make
- make check
解压源码包到build-binutils,建立编译文件夹
- makdir build
- ./configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-multilib --enable-shared
- make configure-host
- make
- make install
在解压好的目录下
配置
- 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
配置
----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹
- 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
配置
----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹
- 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
修正
- 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
可以直接写个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)
好了,只要按着做,应该就有自己的编译器了,不过很多配置我现在也不太清楚,主要就是参考下面的文章,以及碰到错误搜索下了。别急,下一页()会简单看下碰到什么问题以及怎样解决的。
参考:
交叉工具链制作至尊宝典
如何为嵌入式开发建立交叉编译环境
自己动手制作交叉编译工具链
|
评论暂时关闭