歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 一步一步的制作arm-linux交叉編譯環境

一步一步的制作arm-linux交叉編譯環境

日期:2017/2/27 9:23:28   编辑:更多Linux
  我們使用以下版本的文件為例子建立 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.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/linux/arm/kernel/v2.4/patch-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 a




Copyright © Linux教程網 All Rights Reserved