Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15497488
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

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环境中已经安装以下程序或库:texinfogawk(不能为mawk,在编译glibc时出错)bisonflexlibgmp3-devlibmpfr-devautoconflibncurses5-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_BASECONFIG_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

glibcconfigure做补丁

$ 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.SC程序或汇编程序

arm-linux-g++

gcc

编译c++程序

阅读(2835) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~