Tuesday, March 15, 2011

Embedded System 修課紀錄(1-1)

這篇文章主要是 Embedded System 修課紀錄(1) 的加分題,主要是完成 cross compiler 編譯環境或稱 build toolchain 的一連串活動,最後用 Qemu 模擬 Arm 的結果輸出。

準備工具

助教在 VirtualBox 提供的 binutils, gcc, newlib 版本如下所示
binutils-2.15.tar.bz2 
gcc-3.4.6.tar.bz2 
newlib-1.12.0.tar.gz 

目錄架構

將所有檔案和程式碼編放於 /home/sn/lab3_project/ 底下
binutils-2.15.tar.bz2 編譯到 build-binutils,gcc-3.4.6.tar.bz2 則是 build-gcc,newlib-1.12.0.tar.gz 編譯到 build-newlib,而程式碼則放在 src 底下即可,而 toolchain 期望放在 arm-elf,因此相對應的指令為
cd /home/sn/lab3_project/
mkdir build-binutils build-gcc build-newlib
mkdir src

操作過程

以下為 history 所留下的 command line 紀錄,並做分享
  • 解壓縮 Source
tar jxvf binutils-2.15.tar.bz2 
tar jxvf gcc-3.4.6.tar.bz2 
tar zxvf newlib-1.12.0.tar.gz 
  • 編譯並安裝 binutils
cd build-binutils/
../binutils-2.15/configure --target=arm-elf --prefix=/home/sn/lab3_project/arm-elf
make && make install && echo done
  • 增加 /bin 路徑
原先按照授課 tutorial 方法,編譯並安裝 gcc 會發生錯誤,找到的方法是將 prefix 的 bin 納入 $PATH
export PATH=$PATH:/home/sn/lab3_project/arm-elf/bin
  • 編譯並安裝 gcc
cd build-gcc/
../gcc-3.4.6/configure --target=arm-elf --prefix=/home/sn/lab3_project/arm-elf/ --enable-languages=c --with-newlib
make && make install && echo done
  • 編譯並安裝 newlib
cd build-gcc/
cd build-newlib/
../newlib-1.12.0/configure --target=arm-elf --prefix=/home/sn/lab3_project/arm-elf/
make && make install && echo done

驗證 cross-compiler 成果
  • 編寫 Hello World!

這是一定要的啊~所以我們來寫一隻 C 囉。
cd src
vim hello.c

以下是 C 語言程式碼:
#include <stdio.h>

int main() { 
 printf("Hello! World!\n"); 
 printf("哈囉! C!\n");
 return 0; 
}
  • 編譯 hello.c
arm-elf-gcc hello.c
  • 執行結果
sudo apt-get install qemu
sudo qemu-arm hello

// 輸出結果
Hello! World!
哈囉! C!

接著,試著編譯其他版本的 Source。另外有些許疑問 --enable-interwork, --enable-multilib 參數的使用時機以及參考文件 [3.] 所示,GCC 先 make all-gcc 而不是 make all,先去 make newlib C 函式庫,再回來GCC make all的用意。

參數說明

--target 有兩個 arm-elf 以及 arm-linux
arm-linux 的 binutils 使用 glibc library 並作 dynamic link, 所產生出的 binary code 適用於有 linux os 存在的環境。另一方面,arm-elf 的 bintuils 不會去調用glibc, 可以自己選擇 newlib 或 uClibc 為 static link,且開發linux based的嵌入式環境會選用 Glibc。

Reference

[1.] 楊教授課程授課資料
[2.] 自己動手打造Cross compile 環境(一)
[3.] 自己動手打造Cross compile 環境(二)
[4.] 編譯 GCC for ARM 錯誤

No comments:

Post a Comment