本文由《我的arm-gcc工具编译安装过程》修正而成,红字部分为与原作不同之处,希望对大家有所帮助。
原文地址:http://szyou.tiao.blog.163.com/blog/static/28351497200902193223687/
我的编译环境是在ubuntu8.10 amd64,gcc版本为4.3.2,编译的linux内核版本为2.6.8,故后面需要修改少许内核头文件。
开始前确认环境里有texinfo, gawk(注意mawk编译glibc header时会有问题), bison, flex,没有就安装它们。
>sudo apt-get install texinfo gawk bison flex
工作的目录是用户目录下
源文件放在目录cross_source里
编译的工作目录是cross_build
xxx 就是存放解压出来的源代码,例如binutils-2.19.tar.bz2,解压放在binutils-2.19
xxx_build 用于编译的目录,例如binutils-2.19.tar.bz2,编译目录是binutils-2.19_build
用到的文件是
binutils-2.19.tar.bz2
gcc-core-4.3.2.tar.bz2
gcc-g++-4.3.2.tar.bz2
mpfr-2.3.2.tar.bz2
gmp-4.2.4.tar.bz2
linux-2.6.28.tar.bz2
glibc-ports-2.7.tar.bz2
glibc-2.7.tar.bz2
首先创建目录
>mkdir cross_source
>mkdir cross_build
>cd cross_build
1编译,安装binutils
binutils的配置和编译安装,binutils的编译一般不会遇到什么问题,至少我没有遇到。
>sudo apt-get install texinfo
>tar -jxvf ../cross_source/binutils-2.19.tar.bz2
根据[Bug gas/7026] New: ARM target wont build, error: format not a string literal and no format arguments,修改tc-arm.c
>mkdir binutils-2.19_build
>cd binutils-2.19_build
>../binutils-2.19/configure --target=arm-linux --prefix=/usr/local/arm/4.3.2
>make
>sudo make all install
这就会把binutils的编译结果安装到/usr/local/arm/4.3.2/里
binutils安装后需要把路径导出。
>export PATH=$PATH:/usr/local/arm/4.3.2/bin
>export PATH=$PATH:/usr/local/arm/4.3.2/arm-linux
2第一次编译,安装gcc
<第一次编译gcc只是为了产生针对target用的编译工具,因此不需要头文件和特别注意的,当然要注意满足target的要求>
>cd .. #转到cross_build
>tar -jxvf ../cross_source/gcc-core-4.3.2.tar.bz2
从 GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为"gmp"和"mpfr",那么GCC的编译程序将自动将两者与GCC一起编译。建议尽可能使用最新的GMP和MPFR版本。
>tar -jxvf ../cross_source/mpfr-2.3.2.tar.bz2
>tar -jxvf ../cross_source/gmp-4.2.4.tar.bz2
>mv mpfr-2.3.2 gcc-4.3.2/mpfr
>mv gmp-4.2.4 gcc-4.3.2/gmp
既然是第一次安装ARM交叉编译工具,那么本机的glibc支持的应该是本机的编译工具库,而不是ARM交叉编译工具库。并且支持ARM交叉编译工具的其它支持语言(比如:C++、java)的libc库(最终的gcc生成的二进制代码联接需要该库支持)我们也没有,所以,要增加编译开关:
--enable-languages=c --disable-threads --disable-shared
同样,由于第一次安装ARM交叉编译工具,那么支持的libc库的头文件也没有!所以我们征用Dinhibit_libc来解决这个问题。操作如下:
>cp gcc-4.3.2/gcc/config/arm/t-linux ~/gcc-3.4.5/gcc/config/arm/t-linux.orig #备份一下(见后文**处还原备份)
>vim gcc-4.3.2/gcc/config/arm/t-linux
给TARGET_LIBGCC2_CFLAGS = 增加操作参数
-Dinhibit_libc -D__gthr_posix_h
保存退出。
>mkdir gcc-4.3.2_build
>cd gcc-4.3.2_build
>../gcc-4.3.2/configure --target=arm-linux --prefix=/usr/local/arm/4.3.2 --disable-threads --disable-shared --enable-languages=c --disable-libmudflap --disable-libssp
由于没有arm的glibc,需要使用--disable-libmudflap --disable-libssp,禁止两个边界检查使用的库。
>make all #忽略编译的错误,我也没有编译通过,不过不用担心的,马上安装。
>sudo make install
3创建头文件,主要是kernel的头文件,解压下载的linux kernel (如果有对应的arm的kernel更好)
>cd .. #转到cross_build
>tar -jxvf ../cross_source/linux-2.6.28.tar.bz2
>cd linux-2.6.28
>make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
在menuconfig里面load一个别人的2410的配置然后退出并保存
>make ARCH=arm CROSS_COMPILE=arm-linux- #这个不用等编译结束,开始一两分钟就用Ctrl+C中止。
@复制kernel头文件到目标
>sudo cp -a include/linux /usr/local/arm/4.3.2/include/linux
>sudo cp -a include/asm-arm /usr/local/arm/4.3.2/include/asm
>sudo cp -a include/asm-generic /usr/local/arm/4.3.2/include/asm-generic
#低版本的内核若没有文件则不做以下两步
>sudo cp -a arch/arm/include/asm /usr/local/arm/4.3.2/include
>sudo cp -a arch/arm/mach-s3c2410/include/mach /usr/local/arm/4.3.2/include/asm
4编译glibc
>cd .. #转到cross_build
>tar -jxvf ../cross_source/glibc-2.7.tar.bz2
安装arm内核支持的包
>tar -jxvf ../cross_source/glibc-ports-2.7.tar.bz2
>mv -v glibc-ports-2.7 glibc-2.7/ports
>cd glibc-2.7
打补丁
>patch -Np1 -i ../../cross_source/glibc-2.7-alpha_ioperm_fix-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-branch_update-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-branch_update-1A.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-libgcc_eh-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-localedef_segfault-1.patch
接着做以下动作
原来从gcc4.3开始将一部分头文件放到另一个文件夹中,导致glibc找不到,对glibc的configure做补丁:
>sed -i -e "/ccheaders=/s@\`\(\$CC.*include\)\`@\"& -isystem \`\1-fixed\`\"@" configure
还有就是为了编译通过修改的文件
>sed -i 's/# define UNDOCARGS_5\tUNDOCARGS_4/&\n\n# define DOCARGS_6\tDOCARGS_5\n# define UNDOCARGS_6\tUNDOCARGS_5/' ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
//低版本内核先不做/**/内的步骤:
/*
>sed -i 's/__deprecated/__attribute__((deprecated))/' ../linux-2.6.27/arch/arm/include/asm/memory.h
在上面的文件memory.h里,增加宏CONFIG_DRAM_BASE和CONFIG_DRAM_SIZE的定义(随便定义即可),还有就是把“<mach/memory.h>”为“<asm/mach/memory.h>”
在文件里ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h,增加头文件#include <tls.h>
*/
//added by David.Morre,从这里开始做:
>cd /usr/local/arm/4.3.2/include/asm
>ln -s arch-s3c2410 arch
>cd - #转到cross_build
在/usr/local/arm/4.3.2/include/asm/unistd.h的第311行加入:
#define __ARM_NR_set_tls (__ARM_NR_BASE+5)
285行加入:
#define __NR_set_tid_address (__NR_SYSCALL_BASE+256)
>mkdir -v glibc-2.7_build
>cd glibc-2.7
>gedit ./ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h
加入一行#include <tls.h>,保存退出。
>cd ../glibc-2.7_build
>sudo gedit ~/.bashrc
加入以下一行export PATH=$PATH:/usr/local/arm/4.3.2/bin
(注意:如果以前PATH加入了arm-linux-gcc交叉编译链,需要去掉)
>CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib ../glibc-2.7/configure --host=arm-linux --prefix=/usr/local/arm/4.3.2/arm-linux --enable-add-ons --with-headers=/usr/local/arm/4.3.2/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
>make
>sudo make install
按照上面的方法,编译是能通过的。
5用现有的交叉编译工具重新构造gcc
>cd .. #转到cross_build
恢复先前修改的t-linux文件: **,还原备份
>cd gcc-4.3.2/gcc/config/arm/
>mv t-linux t-linux-bak
>mv t-linux-org t-linux
>
安装c++包
>cd ../../.. #转到cross_build文件夹下
>tar -jxvf ../cross_source/gcc-g++-4.3.2.tar.bz2 #gcc-core-4.3.2将由gcc-g++-4.3.2覆盖,以加入C++部分
cd gcc-4.3.2_build/
>make clean
>make distclean
如果需要gcc支持C和C++编程语言,用下面这个配置:
>../gcc-4.3.2/configure --target=arm-linux --prefix=/usr/local/arm/4.3.2 --enable-languages=c,c++ --enable-threads=posix --enable-shared --enable-__cxa_atexit --with-local-prefix=/usr/local/arm/4.3.2/arm-linux
将/usr/local/arm/4.3.2/include文件夹拷贝至/usr/local/arm/4.3.2/arm-linux文件夹中
>make all
>sudo make install
好,编译结束了,试试自己做的arm-linux-gcc工具吧