2010年9月11日 星期六

ARM GCC Toolchain (Cross Compiler) for CentOS 4.8




這兩天花了一點時間在自己的 Server 上裝了  ARM GCC Toolchain (Cross Compiler),之前都使用ARM官版的 RVDS, 不過看學弟們都是用 GNU GCC,所以自己也動手來玩看看。學弟們大部份都在 Ubuntu 上安裝,不過自已的 Server 因為 CIC Tools 的關係而使用 CentOS 4.8。因為環境上的差異,遇到了一些問題,後來陸續解決了 (感謝定遠, 阿德, 冠仲, 阿孜的幫忙),所以在這邊和大家分享自己的安裝步驟。

ARM GCC Toolchain 主要分為兩大類 arm-elf-* 和 arm-linux-* arm-linux-* 是為了要編譯那些要執行在已經有 Linux OS 支援的環境上的程式,使用和 Linux 一樣的 Glibc 這種特定的 C 語言庫。而 arm-elf-* 則是一個獨立的編譯系統,使用 newlib 等其他 C 語言庫,不要求OS支援。主要是為了編譯那些針對嵌入式系统而設計的裸機程式。

目前先和大家分享  arm-elf-* 的部份。


 1. 套件下載
  • 到 GNU 官網下載需要的套件
    binutils-2.19
    gcc-4.5.1
    newlib-1.16.0
    gdb-7.2

    binutils, gcc, gdb 可至 ftp://ftp.ntu.edu.tw/pub/gnu/gnu/ 下載,而 newlib 可至 http://www.mirrorservice.org/sites/sourceware.org/pub/newlib/ 下載。

  • 安裝過程請使用 root 身份,避免權限不足。

  • 我們將套件安裝檔案統一放到 /opt/Toolchain
    另外預計將編譯後的執行檔放在 /usr/cross 下。
    (上述兩個路徑可以任意選擇)

  • 將下載的所有套件於 /opt/Toolchain 下解壓縮。

2. 安裝 binutils 套件
  • 嘗試安裝 binutils-2.20 在 make 過程會有 Error,所以建議安裝 binutils-2.19

  • 切換到 binutils-2.19 安裝資料夾
    cd /opt/Toolchain/binutils-2.19

  • Configure
    ./configure --target=arm-elf
                         --prefix=/usr/cross
                         --enable-interwork
                         --enable-multilib


  • Make & Install
    make -j9
    (如果是在多核心的環境,後面的參數可加快make過程,-j是開多核跑,通常會下N+1)
    make install -j9
    (結束後去看 /usr/cross/bin 下面,應該會有 arm-elf-ar arm-elf-nm arm-elf-objdump 等幾個執行檔。)

  • 將執行檔路徑加到系統路徑中
    (bash) export PATH=$PATH:/usr/cross/bin
    (csh)    setenv PATH "{$PATH}:/usr/cross/bin"

3. 安裝 gcc 套件(上)
  • 安裝 gcc-4.5.1 需要另外 gmp, mpfr, mpc 三個套件,可在下面路徑下載:
    ftp://gcc.gnu.org/pub/gcc/infrastructure/
    另外根據套件相依關係,安裝順序為 gmp, mpfr, mpc, gcc

  • 假設我們已經將以上三的套件檔各別解壓縮到 /opt/Toolchain 下, 並打算各別安裝到 /usr/cross下。

  • 安裝 gmp 套件
    cd  /opt/Toolchain/gmp-4.3.2
    .configure --prefix=/usr/cross/gmp-4.3.2
    make
    -j9
    make install
    -j9

  • 安裝 mpfr 套件
    cd /opt/Toolchain/mpfr-2.4.2
    .configure --prefix=/usr/cross/mpfr-2.4.2
                        --with-gmp=/usr/cross/gmp-4.3.2

    make
    -j9
    make install
    -j9

  • 安裝 mpc 套件
    cd /opt/Toolchain/mpc-0.8.1
    .configure --prefix=/usr/cross/mpc-0.8.1
                        --with-gmp=/usr/cross/gmp-4.3.2
                        --with-mpfr=/usr/cross/mpfr-2.4.2

    make
    -j9
    make install
    -j9

  • 安裝 gcc 套件
    cd /opt/Toolchain/gcc-4.5.1
    ./configure --target=arm-elf
                         --prefix=/usr/cross
                         --enable-interwork
                         --enable-multilib
                         --enable-languages="c,c++"
                         --with-newlib
                         --with-headers=/opt/Toolchain/newlib-1.16.0/newlib/libc/include
                         --with-gmp=/usr/cross/gmp-4.3.2
                         --with-mpfr=/usr/cross/mpfr-2.4.2
                         --with-mpc=/usr/cross/mpc-0.8.1
    make all-gcc
    -j9
    make install-gcc
    -j9

  • 完成後去看 /usr/cross/bin下面,應該會有 arm-elf-gcc, arm-elf-c++, arm-elf-cpp ... 等一大堆執行檔。

4. 安裝 newlib 套件
  • 因為安裝 newlib 會找不到 mpfr 及 mpc 的 lib, 所以需要先將其 lib 的路徑加到系統的 LD_LIBRARY_PATH 變數中。
    (csh) setenv LD_LIBRARY_PATH "{$LD_LIBRARY_PATH}:/usr/cross/mpfr-2.4.2/lib:/usr/cross/mpc-0.8.1/lib"

  • 切換到newlib-1.16.0 安裝資料夾
    cd /opt/Toolchain/newlib-1.16.0

  • Configure
    ./configure --target=arm-elf
                         --prefix=/usr/cross
                         --enable-interwork
                         --enable-multilib


  • Make & Install
    make -j9
    make install
    -j9

5. 安裝 gcc 套件(下)
  • 各別將以下三個 Makefile 檔中
    第23行 host_subdir = . 改成 host_subdir = host-i686-pc-linux-gnu
    /opt/Toolchain/gcc-4.5.1/arm-elf/fpu/libgcc/Makefile
    /opt/Toolchain/gcc-4.5.1/arm-elf/libgcc/Makefile
    /opt/Toolchain/gcc-4.5.1/arm-elf/thumb/libgcc/Makefile


  • 切換到 gcc-4.5.1安裝資料夾後,重新 Make & Install
    cd /opt/Toolchain/gcc-4.5.1
    make all install
    -j9

6. 安裝 gdb 套件
  • 切換到 gdb-7.2 安裝資料夾
    cd /opt/Toolchain/gdb-7.2

  • Configure
    ./configure --target=arm-elf
                         --prefix=/usr/cross
                         --enable-interwork
                         --enable-multilib


  • Make & Install
    make -j9
    make install
    -j9

  • 編完後 /usr/cross/bin 下面應該會多出 arm-elf-gdb, arm-elf-run... 等執行檔,到這邊 Toolchain 就算是建立完成囉。

7. 環境測試
  • 在任意資料夾下寫一個 hello.c 的 C 程式
  • 進行編譯及執行的測試動作
    arm-elf-gcc hello.c -o hello
    arm-elf-run ./hello


沒有留言: