Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21074
  • 博文数量: 10
  • 博客积分: 1401
  • 博客等级: 上尉
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-17 13:34
文章分类

全部博文(10)

文章存档

2009年(10)

我的朋友

分类:

2009-12-17 14:49:32

 
2009-09-11 11:53

一、准备工作

      

       首先需要一台运行Linux操作系统的PC以完成我们的编译工作。

       其次要准备如下一些源文件。

 

       1、源文件准备

         binutils-2.14.tar.gz

        

         gcc-core-2.95.3.tar.gz

        

         gcc-g++2.95.3.tar.gz

        

         glibc-2.2.4.tar.gz

        

         glibc-linuxthreads-2.2.4.tar.gz

        

         linux-2.4.21.tar.gz

        

         patch-2.4.21-rmk1.gz # linux kernel patch for arm

        

 

    binutils-2.14.tar.gz这个压缩包包含有ld,ar,as等一些产生或者处理二进制文件的工具。

    gcc-core-2.95.3.tar.gz这个压缩包是GCC的主体部分,GCC是GNU Compiler Collection的简称,顾名思义,它能够编译很多种高级语言,例如C、C++,Java等,而这个压缩包中含有C编译器,及公共部分,而对其他语言 的支持,采用另外的压缩包单独发布。

    gcc-g++2.95.3.tar.gz,这个压缩包就是为使GCC能够编译C++程序而单独发布的。

    glibc-2.2.4.tar.gz,libc是很多用户层应用都要用到的库,kernel和bootloader不需要这个库的支持,这个库主体部分封装在这个压缩包内。

    glibc-linuxthreads-2.2.4.tar.gz,这是Libc用于支持Posix线程而单独发布的一个压缩包。

    linux-2.4.21.tar.gz,这个压缩包就是Linux的内核。

    patch-2.4.21-rmk1.gz,这个压缩包是用来给Linux内核打补丁,以使其可以支持ARM的硬件平台。

 

       2、工作目录搭建

       我们创建如下的目录树结构

       mkdir arm

       mkdir tool-chain

       mkdir build-dir

       mkdir src-dir

       mkdir setup-dir

       mkdir kernel

      

       arm这个目录是我们的最顶层工作目录,我们所有的编译工作都在这里完成。

       tool-chain这个目录是我们交叉编译工具的安装位置,它下面的bin子目录存放我们创建好的编译器,汇编器,连接器,以及编译好的C库也会安装到这个目录之下。

       setup-dir这个目录用来存放我们下载的压缩包。

       src-dir这个目录用于存放binutils,gcc,glibc解压之后的源文件。

       kernel这个目录用来存放内核文件,对内核的配置、编译工作将在这个目录中完成。

       build-dir用来编译src-dir中的源文件,具体就是binutils,gcc,glibc的编译工作将在这个目录下完成。这种源文件目录和编译目录分离的编译方式是GNU所推荐的。

      

       cd ./src-dir

       tar –xvzf ../setup-dir/ binutils-2.14.tar.gz

       tar –xvzf ../setup-dir/ gcc-core-2.95.3.tar.gz

       tar –xvzf ../setup-dir/ glibc-2.2.4.tar.gz

       tar –xvzf ../setup-dir/ glibc-linuxthreads-2.2.4.tar.gz –directory=./glibc-2.2.4

 

       这样我们在src-dir目录下就形成了3个源文件目录binutils-2.14,gcc-core-2.95,3,glibc-2.2.4,其中分别 存放着binutils tools,gcc,glibc的源代码。接下来我们到build-dir中创建3个与这三个源文件目录对应的编译目录。

      

       cd ../build-dir

       mkdir ../build-dir/build-binutils

       mkdir ../build-dir/build-gcc

       mkdir ../build-dir/build-glibc

 

       我们将在这三个目录中完成对binutils tools, gcc, glibc的配置和编译工作。下面还要把内核文件解压到kernel目录下,并打补丁。

 

       cd ../kernel

       tar –xvzf ../setup-dir/ linux-2.4.21.tar.gz

       cd ./linux-2.4.21

       patch –p1 < ../../setup-dir/ patch-2.4.21-rmk1

 

 

二、开始创建

 

1、  确定几个系统变量

cd ../../

export TARGET=arm-linux

export PREFIX=../arm/tool-chain

export TARGET_PREFIX=$PREFIX/$TARGET

export KERNEL_SOURCE_LOCATION=../arm/kernel/linux-2.4.21

export PATH=$PREFIX/bin:$PATH

 

    几个系统变量经常要用到,TARGET定义了目标机,PREFIX是工具链的安装目录,KERNEL_SOURCE_LOCATION是内核文件位置。

    TARGET这个变量对于ARM体系的目标机来说取值为arm-linux,对于其他体系结构的机器如ppc,mips的取值的详细清单可以参见glibc目录下的INSTALL文档.

 

2、  创建binutils

       运行如下命令来创建binutils

       cd ./build-dir/build-binutils

       configure ../../src-dir/binutils-2.14/configure –target=$TARGET –prefix=$PREFIX

       make

       make install

       这时$PREFIX/bin下创建了一些文件,包括arm-linux-ld,arm-linux-as等。

3、  编译内核

 

       cd ../../kernel/linux-2.4.21

      

       改Makefile文件使

       ARCH = arm

       CROSS_COMPILE=arm-linux-

      

       make menuconfig

       在System Types中选择正确的硬件类型

 

       make dep

 

       之后执行如下操作

       mkdir $TARGET_PREFIX/include

       cp dR $KERNEL_SOURCE_LOCATION/include/arm-asm \

                     RGET_PREFIX/include/asm

       cp dR $KERNEL_SOURCE_LOCATION/include/linux \

                     RGET_PREFIX/include/linux

 

4、  创建boot-trap gcc,这个GCC没有glibc库的支持,所以只能用于编译内核,bootloader等,后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和bootloader那么,就可以到此结束。

       cd ../../build-dir/build-gcc

       ../../src-dir/gcc-2.95.3/configure –target=$TARGET –prefix=$PREFIX \

              --with-headers=$ERNEL_SOURCE_LOCATION/include –enable-language=c \

              --disable-threads

       然后修改src-dir/gcc-2.95.3/gcc/config/arm/t-linux文件,在

              TARGET_LIBGCC2_CFLAGS中添加如下两个定义

              -Dinhibit-libc –D__gthr_posix_h

       make

       make install

       这时$PREFIX/bin下创建了一些文件,主要创建了arm-linux-gcc。

5、  创建gblic

       cd ../build-glibc

       export CC=arm-linux-gcc

       ../../src-dir/glibc-2.2.4/configure –host=$TARGET –prefix=$TARGET_PREFIX \

                            --enable-add-ons

       make

       make install

 

       将glibc库安装完之后,我们要到$TARGET_PREFIX/lib这个目录下修改libc.so文件,将其中

             GROUP(/lib/libc.so.6 /lib/libc_noshared.a)

       这个命令脚本中的/lib 的绝对路径去掉, 也就是改为如下的形式

             GROUP(libc.so.6 libc_noshared.a)

       这样下一步创建完整的编译器时,才不至于导致错误.

6、  创建功能健全的GCC,并创建G++

       在成功创建了libc之后,我们就可以创建功能丰富的GCC编译器了,并且可以创建支持编译C++程序的G++。

       cd ../../src-dir

       tar –xvzf ../setup-dir/ gcc-g++2.95.3.tar.gz

       cd ../build-dir/build-gcc

       export CC=gcc

       ../../src-dir/gcc-2.95.3/configure –target=$TARGET –prefix=$PREFIX \

              –enable-language=c,c++

      

       然后修改src-dir/gcc-2.95.3/gcc/config/arm/t-linux文件,在

              TARGET_LIBGCC2_CFLAGS中去除如下两个定义

              -Dinhibit-libc –D__gthr_posix_h

 

       make

       make install

 

7,至此我们成功的创建了ARM Linux的交叉编译工具。

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