编译环境: Ubuntu 8.10
编译用到的文件: binutils-2.19.1.tar.bz2 linux-2.6.28.8.tar.bz2 gcc-core-4.3.2.tar.bz2 mpfr-2.3.2.tar.bz2 gmp-4.2.4.tar.bz2 gcc-g++-4.3.2.tar.bz2 glibc-2.7.tar.bz2
第一步:配置编译环境
首先确认 Ubuntu 8.10 环境中已经安装以下程序或库 :texinfo , gawk( 不能为 mawk ,在编译 glibc 时出错 ) , bison , flex , libgmp3-dev , libmpfr-dev , autoconf , libncurses5-dev 。
$ sudo apt-get remove mawk
$ sodu apt-get install texinfo gawk bison flex libgmp3-dev libmpfr-dev autoconf libncurses5-dev
$ sudo passwd root
给 root 用户增加密码
工具链选择安装于: /usr/local/cross-arm
在 ~/.bashrc 中加入环境变量
export PATH=/usr/local/cross-arm/bin:/usr/local/cross-arm/arm-linux:$PATH
保存并退出 ~/.bashrc
使 ~/.bashrc 立即生效:
$ source ~/.bashrc
第二步:编译 binutils
$ tar -xvjf binutils-2.19.1.tar.bz2
$ cd binutils-2.19.1
$ mkdir build
$ cd build
$ ../configure --target=arm-linux --prefix=/usr/local/cross-arm
$ make all
此时可能会编译出错:
../../gas/config/tc-arm.c: 在函数 ’s_arm_unwind_save_mmxwr’ 中:
../../gas/config/tc-arm.c: 3459 :错误 : 格式字符串不是一个字面字符串而且没有待格式化的实参
../../gas/config/tc-arm.c: 3473 :错误 : 格式字符串不是一个字面字符串而且没有待格式化的实参
../../gas/config/tc-arm.c: 在函数 ’s_arm_unwind_save_mmxwcg’ 中:
../../gas/config/tc-arm.c: 3591 :错误 : 格式字符串不是一个字面字符串而且没有待格式化的实参
../../gas/config/tc-arm.c: 3606 :错误 : 格式字符串不是一个字面字符串而且没有待格式化的实参
../../gas/config/tc-arm.c: 在函数 ’s_arm_unwind_save_movsp’ 中:
../../gas/config/tc-arm.c: 3712 :错误 : 格式字符串不是一个字面字符串而且没有待格式化的实参
打开并修改 tc-arm.c :
@@3459@@
原: as_bad(_(reg_expected_msgs[REG_TYPE_MMXWR]));
改为: as_bad(“%s”,_(reg_expected_msgs[REG_TYPE_MMXWR]));
@@3473@@
原: as_bad(_(reg_expected_msgs[REG_TYPE_MMXWR]));
改为: as_bad(“%s”,_(reg_expected_msgs[REG_TYPE_MMXWR]));
@@3591@@
原: as_bad(_(reg_expected_msgs[REG_TYPE_MMXWCG]));
改为: as_bad(“%s”,_(reg_expected_msgs[REG_TYPE_ MMXWCG]));
@@3606@@
原: as_bad(_(reg_expected_msgs[REG_TYPE_MMXWCG]));
改为: as_bad(“%s”,_(reg_expected_msgs[REG_TYPE_ MMXWCG]));
@@3712@@
原: as_bad(_(reg_expected_msgs[REG_TYPE_RN]));
改为: as_bad(“%s”,_(reg_expected_msgs[REG_TYPE_ RN]));
保存。
$ make all
$ sudo make all install
第三步: basic GCC
$ tar -jxvf gcc-core-4.3.2.tar.bz2
$ tar -jxvf mpfr-2.3.2.tar.bz2
$ tar -jxvf 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
$ cp gcc-4.3.2/gcc/config/arm/t-linux gcc-4.3.2/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
保存退出。
$ cd gcc-4.3.2
$ mkdir build
$ cd bulid
$../configure --target=arm-linux --prefix=/usr/local/cross-arm --disable-threads --disable-shared --enable-languages=c --disable-libmudflap --disable-libssp
$ make all
忽略编译中的错误,继续往下进行
$ sudo make install
第四步 : 创建头文件,主要是 kernel 的头文件
$ tar -jxvf linux-2.6.28.8tar.bz2
$ cd linux-2.6.28.8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ make ARCH=arm CROSS_COMPILE=arm-linux- s3c2410_defconfig
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
或
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ make ARCH=arm CROSS_COMPILE=arm-linux-
$ vi arch/arm/include/asm/memory.h
修改 __deprecated 为 __attribute__((deprecated))
修改 为
增加宏 CONFIG_DRAM_BASE 和 CONFIG_DRAM_SIZE 的定义(随便定义即可)
保存后退出
$ 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
第五步: glibc
$ tar -jxvf glibc-2.7.tar.bz2
$ tar -jxvf glibc-ports-2.7.tar.bz2
$ mv -v glibc-ports-2.7 glibc-2.7/ports
$ cd glibc-2.7
打补丁:
$ patch -Np1 -I ../glibc-2.7-alpha_ioperm_fix-1.patch
$ patch -Np1 -i ../glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
$ patch -Np1 -I ../glibc-2.7-branch_update-1.patch
$ patch -Np1 -I ../glibc-2.7-branch_update-1A.patch
$ patch -Np1 -I ../glibc-2.7-libgcc_eh-1.patch
$ patch -Np1 -I ../glibc-2.7-localedef_segfault-1.patch
对 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
$ vi ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h
增加头文件 #include
$ cd /usr/local/cross-arm/include/asm
$ ln -s arch-s3c2410 arch
$ cd –
$ vi /usr/local/cross-arm/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 build
$ cd build
$ CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib ../configure --host=arm-linux --prefix=/usr/local/cross-arm/arm-linux --enable-add-ons --with-headers=/usr/local/cross-arm/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
$ make
$ sudo make install
第六步: full GCC
$ tar -jxvf gcc-core-4.3.2.tar.bz2
$ tar -jxvf mpfr-2.3.2.tar.bz2
$ tar -jxvf 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
$ tar -xvjf gcc-g++-4.3.2.tar.bz2
$ cd gcc-4.3.2
$ mkdir build
$ cd bulid
$../configure --target=arm-linux --prefix=/usr/local/cross-arm --enable-languages=c,c++ --enable-threads=posix --enable-shared --enable-__cxa_atexit --with-local-prefix=/usr/local/cross-arm/arm-linux
$ make all
$ sudo make install
名称 | 归属 | 作用 |
arm-linux-as | binutils | 编译 ARM 汇编程序 |
arm-linux-ar | binutils | 把多个 .o 合并成一个 .o 或静状库 (.a) |
arm-linux-ranlib | binutils | 为库文件建立索引,相当于 : arm-linux-ar –s |
arm-linux-ld | binutils | 连接器 (Linker) ,把多个 .o 或库文件连接成一个可执行文件 |
arm-linux-objdump | binutils | 查看目标文件 (.o) 和库 (.a) 的信息 |
arm-linux-objcopy | binutils | 转换可执行文件的格式 |
arm-linux-strip | binutils | 去掉 elf 可执行文件的信息,使可执行文件变小 |
arm-linux-readelf | binutils | 读 elf 可执行文件的信息 |
arm-linux-gcc | gcc | 编译 .c 或 .S 的 C 程序或汇编程序 |
arm-linux-g++ | gcc | 编译 c++ 程序 |