如何建立linux交叉編譯器(來自網路的相關文章)

來源:互聯網
上載者:User

 

一步一步的製作arm-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 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 幾兆。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.