原创 创建ARMlinux交叉编译环境的实践

2008-6-3 17:22 4182 7 8 分类: MCU/ 嵌入式
一、准备工作   
       首先需要一台运行Linux操作系统的PC以完成我们的编译工作。
       其次要准备如下一些源文件。

  1、源文件准备
         binutils-2.14.tar.gz 
         ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz
         gcc-core-2.95.3.tar.gz 
         ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz
         gcc-g++2.95.3.tar.gz 
         ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz
         glibc-2.2.4.tar.gz 
         ftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz
         glibc-linuxthreads-2.2.4.tar.gz 
         ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz
         linux-2.4.21.tar.gz
         ftp://ftp.kernle.org/pub/linux/kernel/v2.4/linux-2.4.21.tar.gz
         patch-2.4.21-rmk1.gz # linux kernel patch for arm
         ftp://ftp.arm.linux.org.uk/pub/l ... atch-2.4.21-rmk1.gz
     
    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是内核文件位置。

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

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的交叉编译工具

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户217227 2014-11-19 12:52

Mark一下。现在很少有人这样一步步编译了,都用人家编译好的。留着备用!
相关推荐阅读
用户131105 2008-07-05 23:57
全新RIGOL VS5000系列虚拟示波器推动MSO混合测试实践应用
日前,北京普源精电科技有限公司(RIGOL)宣布,全新的VS5000系列虚拟数字示波器进入市场后,受到用户的普遍关注。RIGOL VS5000系列虚拟数字示波实时采样率高达400 MSa/s, 等 效...
用户131105 2008-07-05 23:55
虚拟数字示波器的设计与实现
虚拟数字示波器的设计与实现2008-3-20摘 要: 结合一个虚拟数字示波器的设计开发,介绍了虚拟仪器的基本组成,并重点介绍了基于图形化编程语言LabVIEW的虚拟仪器编程方法与实现技术。    关键...
用户131105 2008-07-05 23:53
使用TDS3000系列数字荧光示波器观察波形的频率成分 (2)
这时一篇PDF的文档,用泰克的TDS3000系列数字荧光示波器在分析时就可以用FFT图来观察波形的频率成分,希望对大家能有帮助,喜欢的可以下载看看 转自:www.kingcable.com.cn ...
用户131105 2008-06-28 13:10
labview中的串口通信协议示例与分析
变频器与个人电脑使用RS-232/RS-485 串行总线连接,如下所示:         在通讯操作中,通过个人电脑以命令方式控制仪器。    通讯数据格式:    l  起始位: 1 位    l ...
用户131105 2008-06-28 13:07
用示波器的第三维发现信号异常
用示波器的第三维发现信号异常引言  示波器的显示质量极大影响能否有效进行设计查错。如果您的示波器只有低质量的显示,您就不可能看到关键的信号异常。能示出信号亮度等级的示波器也能展示重要的波形细节,包括揭...
用户131105 2008-06-28 13:05
当今仪器仪表的特点与设计方法
1 当今仪器仪表的特点     1.1 硬件功能软件化  随着微电子技术的发展,微处理器的速度越来越快,价格越来越低,已被广泛应用于仪器仪表中,使得一些实时性要求很高,原本由硬件完成的功能,可以通过软...
我要评论
1
7
关闭 站长推荐上一条 /3 下一条