我的编译环境是在xubuntu里,开始前确认环境里有texinfo, gawk(注意mawk编译glibc header时会有问题), 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的编译一般不会遇到什么问题,至少我没有遇到。
>tar -jxvf ../cross_source/binutils-2.19.tar.bz2
>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>
>mkdir -v glibc-2.7_build
>cd glibc-2.7_build
>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++包
>tar -jxvf ../cross_source/gcc-g++-4.3.2.tar.bz2
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
>make all
>sudo make install
好,编译结束了,试试自己做的arm-gcc工具吧