全部博文(2005)
分类:
2009-08-10 12:46:14
编译环境: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
$ 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++程序 |