zoukankan      html  css  js  c++  java
  • 建立 armlinux 交叉编译环境

    我们使用以下版本的文件为例子建立 arm-linux 交叉编译环境:

    编译环境 redhat 7.2 或 8.0
    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....e-2.95.3.tar.gz
    gcc-g++2.95.3.tar.gz
    ftp://ftp.gnu.org/gnu/gcc/gcc-2.95....+-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-l...ds-2.2.4.tar.gz
    linux-2.4.21.tar.gz
    ftp://ftp.kernle.org/pub/linux/kern...x-2.4.21.tar.gz
    patch-2.4.21-rmk1.gz # linux kernel patch for arm
    ftp://ftp.arm.linux.org.uk/pub/linu...-2.4.21-rmk1.gz

    我们在 bash 下工作,先设定一些变量:
    $ export VBINUTILS=2.14
    $ export VGCC=2.95.3
    $ export VGLIBC=2.2.4
    $ export VLINUX=2.4.21
    $ export VLINUX_PATCH=rmk1
    $
    $ export PREFIX=/armtools
    $ export TARGET=arm-linux


    你可以把它们加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。
    否则在 bash 的命令行上输入它们并立即生效,但你 logout 再 login 时它就无效了。

    我们的工作路径是:

    ...../ ----- ~ -- tars -------- SourceDir
    ............|................|---- BuildDir
    ............|--- armtools


    $ cd ~
    $ mkdir -p tars/SourceDir
    $ mkdir tars/BuildDir
    $ mkdir arm_tools
    $ su
    # mv arm_tools $PREFIX
    # exit
    $


    tars --------------- 在这里放我们的下载来的 .tar.gz 文件
    SourceDir ------ 这个临时目录放我们解压缩后的源文件
    BuildDir --------- 我们在这里编译
    armtools -------- 把arm-linux 交叉编译环境的安装在这里


    1.安装linux 的头文件

    当你为不同类型的ARM编译gcc,或编译不同版本的kernel,或交叉编译gcc 时都需要一套不同的linux头文件。


    1.1解压缩,打补丁
    $ cd ~/tars/SourceDir
    $ tar -zxf ../linux-$VLINUX.tar.gz
    $ cd linux
    $ zcat ../../patch- $VLINUX-$VLINUX_PATCH.gz | patch -p1

    1.2清理一下
    $ make mrproper

    1.3修改 Makefile
    将Makefile中ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) 这一行注释掉,并加一行 ARCH=arm。修改后象这样:
    ARCH=arm
    # ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)


    如果你的系统里的 sed 程序支持用 '/' 续行(通常都支持),你可以用这个 script 去修改 Makefile
    #!/bin/sh
    mv Makefile Makefile.orig
    sed 's/ARCH := $(shell uname -m/ARCH=arm/
    # ARCH := $(shell uname -m/' < Makefile.orig > Makefile
    #end of script

    注意:
    这个 script 里的 # ARCH := 是上一行的续行,不是 shell 里的注释,它也是要输入的。
    如果你从浏览器(IE, netscape, etc)上 copy-paste 这个 script 到你的 bash console,它很有可能不工作;
    但你在 bash console 里手工输入就可以工作。
    因为有时 copy 过来后,是 'ARCH=arm/r/n',而能工作的是 'ARCH=arm/n'。


    1.4建立连接
    1.4.1如果是LART板子
    $ make lart_config
    $ yes "" | make oldconfig
    $ make include/linux/version.h
    或:
    $ make lart_config
    $ make menuconfig 选择

    网上有的文章用的是:
    $ make symlinks include/linux/version.h
    那是不完全的。make symlinks 的作用相当于:
    $ cd include/asm-arm
    $ rm -f arch proc
    $ ln -s arch-sa1100 arch
    $ ln -s proc-armv proc
    $ cd ../../
    它并没有产生一个很重要的文件 include/linux/autoconf.h。
    而 yes "" | make oldconfig 不仅是 make symlinks,
    还产生了 include/linux/autoconf.h。但它也没有产生
    include/linux/version.h。

    1.4.2如果是clps711x的CPU
    连接应该为:
    $ cd include/asm-arm
    $ rm -f arch proc
    $ ln -s arch-clps711x arch
    $ ln -s proc-armv proc
    $ cd ../../

    为你自己的系统定制:
    $ make menuconfig
    在这里你只需要选你使用的 CPU 或选则有你使用的 CPU 的板子即可,
    当然进行更详细的配置更好。

    注:
    include/asm-arm/proc-armo 是26位ARM

    include/asm-arm/proc-armv 是32位ARM


    注:背景知识
    在ARM1中实现26位地址空间,但没有被商用。
    在ARM2,2a 中还有26位地址空间,现在已经废弃。
    在ARM3中扩展到32位地址空间,但是还反向兼容26位。
    在ARM4中是32位地址空间,停止兼容26位地址空间。在 T 系列中加入 Thumb 指令。
    在ARM5中是32位地址空间,在所有系列中均支持 16 位的 Thumb 指令。


    1.5拷贝头文件
    $ mkdir -p $PREFIX/$TARGET/include
    $ cp -dR include/linux $PREFIX/$TARGET/include
    $ cp -dR include/asm-arm $PREFIX/$TARGET/include/asm

    1.6为 gcc 建立一个 linux kernel 头文件的连接
    编译gcc时,它需要 linux kernel 的头文件,你可以用 --with-headers=$PREFIX/$TARGET/include 来指定头文件的位置,gcc 把它拷贝到 $PREFIX/$TARGET/sys-include。我们可以建立个 sys-include 连接,就不用 --with-headers 了。
    $ cd $PREFIX/$TARGET
    $ ln -s include sys-include

    2编译安装binutils

    这里用不到前面准备的 linux 头文件


    2.1解压缩
    $ cd ~/tars/SourceDir
    $ tar -zxf ../binutils-$VBINUTILS.tar.gz

    2.2编译
    $ cd ~/tars/BuildDir
    $ mkdir binutils
    $ cd binutils
    $ ../../SourceDir/binutils-$VBINUTILS/configure /
    --target=$TARGET /
    --prefix=$PREFIX
    $ make all install

    2.3输出 binutils 的路径到环境变量中
    你可以把它加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。
    否则在 bash 的命令行上输入它并立即生效,但你 logout 再 login 时它就无效了。
    export PATH=$PREFIX/bin:$PATH

    3.编译安装gcc 的c 编译器
    3.1解压缩
    $ cd ~/tars/SourceDir
    $ tar -zxf ../gcc-core-$VGCC.tar.gz

    注意:为什么不用 all-in-one 的 gcc-$VGCC.tar.gz 呢?
    all-in-one 的 gcc 包里面有 chill, fortran, java 等语言的编译器,虽然在下面 configure 时指定 -enable-languages=c,但编译时还是把所有的都编译一便,这不是我们需要的,而且它也总会有错误。因此我们只编译 C 语言的编译器。后面第二次编译的时候也是这个问题,我们只编译 C 和 C++ 的编译器。


    3.2修改 gcc 的 t-linux 文件
    在 t-linux 文件中的 TARGET_LIBGCC2_CFLAGS 上加上 __gthr_posix_h 和 inhibit_libc

    $ cd gcc-$VGCC/gcc/config/arm
    $ mv t-linux t-linux-orig
    $ sed 's/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/' < t-linux-orig > t-linux-core
    $ cp ./t-linux-core ./t-linux

    3.4编译
    $ cd ~/tars/BuildDir
    $ mkdir gcc-core
    $ cd gcc-core
    $ ../../SourceDir/gcc-$VGCC/configure /
    --target=$TARGET /
    --prefix=$PREFIX /
    --enable-languages=c /
    --disable-shared /
    --disable-threads
    $ make all install

    4.编译安装 glibc
    4.1解压缩
    $ cd ~/tars/SourceDir
    $ tar -zxf ../glibc-$VGLIBC.tar.gz
    $ cd glibc-$VGLIBC
    $ tar -zxf ../../glibc-linuxthreads-$VGLIBC.tar.gz

    4.2编译
    $ cd ~/tars/BuildDir
    $ mkdir glibc
    $ cd glibc
    $ CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib /
    ../../SourceDir/glibc-$VGLIBC/configure /
    $TARGET /
    --prefix=$PREFIX/$TARGET /
    --enable-add-ons
    $ make all install

    5.编译安装gcc 的c, c++ 编译器
    5.1恢复t-linux 文件
    $ cd ~/tars/SourceDir/gcc-$VGCC/gcc/config/arm/
    $ cp t-linux-orig t-linux

    5.2解压缩 c++ 编译器
    $ cd ~/tars/SourceDir/
    $ tar -zxf ../gcc-g++-$VGCC.tar.gz
    $
    $ cd ~/tars/BuildDir
    $ mkdir gcc
    $ cd gcc

    5.3编译
    $ ../../SourceDir/gcc-$VGCC/configure /
    --target=$TARGET /
    --prefix=$PREFIX /
    --enable-languages=c,c++ /
    --with-included-gettext
    $ make all
    $ make install


    注:
    如果你下载的是 filename.tar.bz2,你可以用如下命令之一解压缩,第三种方式在任何系统中都好使。

    $ tar -jxf filename.tar.bz2
    $ tar -Ixf filename.tar.bz2
    $ bzip2 -dc filename.tar.bz2 | tar xf -


    如果你是第一次制作 arm-linux 交叉编译环境,强烈建议你用本文所使用的各个程序的版本。如果用其它版本,按照本文的方法可能会在编译的时候出问题,因为我没有时间去测试各个版本的组合。这里是源程序: crossarm.sh,它使用的是:
    linux-2.4.21.tar.bz2
    patch-2.4.21.bz2
    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
    生成的 toolchain 大于 150 兆,用如下方法压缩:
    $ cd ~
    $ tar -cf armtools.tar /armtools
    $ bzip2 -z armtools.tar

    压缩后生成的 armtools.tar.bz2 大概有 30 几兆。

  • 相关阅读:
    编写C#程序的IDE
    MacBook Pro装Win7后喇叭没有声音
    MacBook Pro装Win7后喇叭没有声音
    MacBook Pro装Win7后喇叭没有声音
    MacBook Pro装Win7后喇叭没有声音
    Linux从入门到精通系列之NFS
    Linux从入门到精通系列之NFS
    Linux从入门到精通系列之NFS
    Docker之docker设置系统的环境变量
    mq put 消息到远程队列
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314605.html
Copyright © 2011-2022 走看看