1. 程式人生 > >一步步製作 Arm-Linux交叉編譯環境

一步步製作 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

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 幾兆。

Credit:

http://www.armlinux.org/docs/toolchain/toolchHOWTO/x183.html

http://www.objsw.com/CrossGCC/FAQ-4.html

http://www.bluewind.it/gnuarm.htm

http://penguinppc.org/usr/embedded/howto/PowerPC-Embedded-HOWTO-12.html