2013年10月28日 星期一

安裝 ARM toolchain (舊/2014版)

目的:安裝 ARM toolchain


Embedded Debian Linux 的官方網站在:http://www.emdebian.org/crosstools.html,要進行 Embedded Debian Linux 開發,首先我們要將 Embedded Linux 的套件庫新增至系統中。

1. 在 /etc/apt/sources.list 新增底下二行:

deb http://www.emdebian.org/debian/ squeeze main
deb http://opensource.nchc.org.tw/debian/ squeeze main contrib non-free

2. 更新套件狀態

apt-get update

此時我們會發現系統有底下警告訊息:

W: GPG error: http://www.emdebian.org wheezy Release: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY B5B7720097BB3B58

我們可以安裝 emdebian-archive-keyring 套件來解決上面的警告訊息,指令如下:

apt-get install emdebian-archive-keyring

安裝完再執行 apt-get update 即無錯誤訊息。

3. 安裝 ARM ToolChain

請安裝底下套件:

gcc-4.4-arm-linux-gnueabi
cpp-4.4-arm-linux-gnueabi
g++-4.4-arm-linux-gnueabi

我們在安裝時會發現系統是由 http://www.emdebian.org 網站下載相關套件,而非 Debian Linux 鏡像站,裝完後的可執行檔名稱如下:

arm-linux-gnueabi-gcc-4.4
arm-linux-gnueabi-g++-4.4
arm-linux-gnueabi-cpp-4.4


4. 驗證 ARM ToolChain

如果我們使用一般 gcc 來觀看版本的話,指令如下:

gcc -v

其輸出為:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-5)

其中有一行

Target: x86_64-linux-gnu

告訴我們此 C 編譯器之目標為 x86_64 平台,現在我們執行 ARM gcc 來看其版本,指令如下:

arm-linux-gnueabi-gcc-4.7 -v

其輸出為:

Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc-4.7
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabi/4.7/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-4' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.7.2 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv4t --with-float=soft --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --with-headers=/usr/arm-linux-gnueabi/include --with-libs=/usr/arm-linux-gnueabi/lib
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-4)

我們可以由上面的 Target 這行看到其目標為 arm-linux-gnueabi


5. 實際編譯 C 程式

在此以 C 程式第一個範例 hello.c 作編譯測試,其原始碼如下:

void main(void)
{
  printf("Hello World\n");
}

我們先以 gcc 來編譯此程式,指令如下:

gcc hello.c -o hello

此時會產生一個 hello 的可執行檔,其屬性如下:

-rwxr-xr-x 1 herman herman 6751 10月 29 09:33 hello

我們可以使用 file hello 來觀看其檔案資訊,輸出如下:

hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xf29466ceaf1115e4b88f524d8432210a2a1ea1ca, not stripped

從上述資訊我們可以看到 hello 是 x86-64 的可執行檔,接下來我們以 ARM gcc 來編譯,指令如下:

arm-linux-gnueabi-gcc-4.7 hello.c -o hello_arm

此時會產生一個 hello_arm 的可執行檔,我們可以使用 file hello_arm 來觀看其檔案資訊,輸出如下:

hello_arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x8f91e5977bcd09b9b94028392cdd29560fb655ee, not stripped

從上述資訊我們可以看到 hello 是 ARM 的可執行檔。到這裡為止,我們已經初步完成 ARM ToolChain 安裝,接下來我們將使用此 Tool Chian 來編譯 ARM 版 Linux 核心以及 bootloader,並將系統植入先前完成之 sdcard.img 中,再以 qemu 來開機。

沒有留言:

張貼留言