📄 buildarmlinuxcrosstools.txt
字号:
Arm linux 交叉开发工具链安装步骤
经过无数次的失败之后,终于搞定了Arm linux的交叉编译工具链的安装。下面把成功的步骤罗列如下:
主要是参考了http://frank.harvard.edu/~coldwell/toolchain/中的步骤。
主机环境:
联想旭日150笔记本,i386结构(i686?)
windows2000 安装vmware 5.5.1
vmware中安装有 Redhat linux 9.0 内核为:
一、准备工作
1、规划创建所需要的目录
为了不影响系统原有的工具链,决定将交叉工具链安装在一个特定的路径中
#mkdir /usr/src/armgcc //用于存放下载的源代码包
#mkdir /usr/local/arm //准备用来安装交叉工具链的路径
2、建立相应的环境变量,以方便后面使用
export TARGET=arm-linux
export PREFIX=/usr/local/arm
export SYSROOT=${PREFIX}/sysroot
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export SRC=/usr/src/armgcc
export PATH=$PATH:${PREFIX}/bin
为了方便,把他们放在用户目录中的.bash_profile文件中,这样不用每次启动计算机都要重新设置了,我是放在/root/.bash_profile中
3、下载相应的源代码包
将所需要的源代码包下载到${SRC}目录中,和参考资料中的不同,我采用了不同的版本
linux-2.4.26.tar.bz2 patch-2.4.26-vrs1.gz
gcc-3.4.4.tar.gz
glibc-2.3.4.tar.bz2 glibc-linuxthreads-2.3.4.tar.bz2
binutils-2.14.tar.gz
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3"
http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff
二、开始安装
1、安装Binutils
这个步骤是最顺利的,在历次失败的安装过程中,这个步骤也都没有出现过什么问题。
#cd ${SRC}
#tar xvfz binutils-2.14.tar.gz
#mkdir -p bdbin
#cd bdbin
#../binutils-2.14/configure --prefix=${PREFIX} --target=${TARGET} --with-sysroot=${SYSROOT}
#make
#make install
完成之后,在${PREFIX}/bin目录和${PREFIX}/{TARGET}/bin目录中,会有相应的工具程序。
2、linux内核头文件的安装
#cd ${SRC}
#tar xvfj linux-2.4.26.tar.bz2 #gzip -d patch-2.4.26-vrs1.gz
#cd linux-2.4.26
#cp ../patch-2.4.26-vrs1 ./ #patch -p1 < patch-2.4.26-vrs1 #make ARCH=arm menuconfig #make
//最后一步make,有点怀疑,那是华恒的资料中的步骤,感觉不应该整体进行编译啊,以前的参考资料,包括上面harvard的参考资料中,都是只针对特定头文件进行编译的。
//make include/linux/version.h
#mkdir -p ${SYSROOT}/usr/include
#cp -a ${PREFIX}/src/linux/include/linux ${SYSROOT}/usr/include/linux
#cp -a ${PREFIX}/src/linux/include/asm-arm ${SYSROOT}/usr/include/asm
#cp -a ${PREFIX}/src/linux/include/asm-generic ${SYSROOT}/usr/include/asm-generic
//上面复制都文件到相应的目录中时,华恒的有误,把asm-i386复制了。估计是,参考LFS内核升级的资料,直接抄过来了。
3、glibc头文件安装
#cd ${SRC}
#tar xvfj glibc-2.3.4.tar.bz2
#cd glibc-2.3.4
#tar xvfj ../glibc-linuxthreads-2.3.4.tar.bz2
#vi sysdeps/unix/sysv/linux/arm/ioperm.c
修改 第103、104两行中的BUS_ISA 为CTL_BUS_ISA。(注意,这两行中有多个BUS_ISA,要修改的只是其中不与其它符号相连的那两个BUS_ISA)
#cd ..
#mkdir bdlib
#cd bdlib
#../glibc-2.3.4/configure --prefix=/usr --host=${TARGET} --enable-add-ons=linuxthreads \
--with-headers=${SYSROOT}/usr/include
#make cross-compiling=yes install_root=${SYSROOT} install-headers
#touch ${SYSROOT}/usr/include/gnu/stubs.h
#touch ${SYSROOT}/usr/include/bits/stdio_lim.h
//需要注意,上面配置的时候,--prefix=/usr的确是这样的,可能glibc和gcc、binutils中prefix选项的含义不一样
4、第一次安装gcc
#cd ${SRC}
#tar xzvf gcc-3.4.4.tar.gz
#patch -d gcc-3.4.4 -p1 < flow.c.diff
#patch -d gcc-3.4.4 -p1 < t-linux.diff
#mkdir bdgcc
#../gcc-3.4.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c \
--with-sysroot=${SYSROOT}
注意:不能加上"--disable-shared"选项。(华恒的注释,不知道为什么,有什么考虑)。
#make all-gcc
#make install-gcc
5、安装完整的glibc
很耗时间啊,整个过程中,这个步骤是消耗时间最长的。
#cd ${SRC}/bdlib
#rm * -rf
#BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib \
AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld \
../glibc-2.3.4/configure --prefix=/usr --build=i386-redhat-linux --host=arm-unknown-linux-gnu \
--target=arm-unknown-linux-gnu --without-__thread --enable-add-ons=linuxthreads \
--with-headers=${SYSROOT}/usr/include
#make
#make install_root=${SYSROOT} install
6、安装完整的gcc
#cd ${SRC}/bdgcc
#rm * -rf
#../gcc-3.4.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c \
--with-sysroot=${SYSROOT}
#make
#make install
好啦,交叉编译工具链,到此就建立成功啦。
7、试验
harvard的参考资料上,还有一个步骤是,用刚建立的工具链编译内核,呵呵,应该是可行的了。
#cd ${SRC}/linux-2.4.26
#make zImage
#make modules
#make INSTALL_MOD_PATH=${SYSROOT} modules_install
编译出来的内核在 arch/arm/boot/zImage
相应的可载入模块将被安装在/usr/arm/sysroot/lib/modules/[kernel-version]
后面那据话,不知道是什么意思,是不是说编译之后就在那个位置,还是说将来使用的时候应该放的位置?
另外:the directory /usr/arm/sysroot has been set that it is suitable for NFS export as a root filesystem for the target system.
参考资料:
1、http://frank.harvard.edu/~coldwell/toolchain/
2、linux_移植指南.pdf
另外,在下面的资料中看到了对一些配置选项的介绍:
GNU toolchain for ARM 编译笔记
交叉编译GNU工具链真是折磨人的差事阿……以后再也不做了。
以下是编译笔记
______________________________________________
构建自己的arm-linux toolchain:
生成工具链目录结构:
/usr/armtools
`----arm-linux 目标平台相关内容
| `----bin gcc内部使用的编译/连接工具
| `----lib gcc的内部库/c++ 库
| | `----ldscripts ld的连接脚本
| `----target-root 目标平台根目录
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -