2016年10月23日 星期日

安裝 ARM toolchain (2016 年版)

安裝 Cross toolchain

目前 ARM 的平台已經有 64 位元 CPU,其 Debian 架構是 aarch64,為了兼顧傳統 32 位元之 armel/armhf 支援,及最新的 aarch64 架構支援,我們必須安裝這三者之 toolchain,並分別設定其指令才能使用。要編譯 ARM 平台的程式,必須安裝 Cross toolchain,所謂的 Cross toolchain 就是 在 X86 平台上編譯 ARM 的可執行檔。要安裝這些 toolchain 必須使用 Embedded Debian Project 所提供資源,所以我們要修改 /etc/apt/sources.list 這個檔案,新增底下設定:

#armhf toolchain
deb http://emdebian.org/tools/debian/ jessie main

新增完畢之後,請執行:

# apt-get update

然後執行:
# dpkg --print-foreign-architectures
armel
i386

這裡可以看到目前我們的系統支援 armel 以及 i386 等非 x86_64 平台的架構,現在請
執行:

# dpkg --add-architecture armhf
# dpkg --add-architecture arm64

來新增 armhf 及 arm64 架構,作完之後再重新執行剛剛的指令可以看到目前已經有
armhf 架構了,指令如下:
# dpkg --print-foreign-architectures

其輸出至少會有三行:
armel                   - armel 架構
armhf                   - armhf 架構
arm64                   - arm64 架構


接著安裝 armhf 以及 arm64 的 gcc 套件,請執行:

# apt-get update
# apt-get install crossbuild-essential-armhf
# apt-get install crossbuild-essential-arm64


為了方便未來我們使用這三個不同版本的工具,請在 ~/.bashrc 中新增底下設定:

alias makearm='make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-'
alias makerpi='make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-'
alias makearm64='make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-'

然後安裝

# apt-get install qemu-user qemu-user-static

接下來執行底下指令來驗證 armhf 版本之編譯工具是否已安裝完成:

$ arm-linux-gnueabihf-gcc -v
$ arm-linux-gnueabihf-cpp -v
$ arm-linux-gnueabihf-g++ -v


然後請再執行底下指令來驗證 arm64 版本之編譯工具是否已安裝完成:

$ aarch64-linux-gnu-gcc -v
$ aarch64-linux-gnu-cpp -v
bash: aarch64-linux-gnu-cpp:命令找不到

上述錯誤是指在 /usr/bin 目錄沒有底下連結,請自行建立:

lrwxrwxrwx 1 root root 25 10月 24 10:07 aarch64-linux-gnu-cpp -> aarch64-linux-gnu-cpp-4.9

建立完再重新執行一次:

$ aarch64-linux-gnu-cpp -v

此時應該就沒有問題了,請再執行最後一個程式的驗證:

$ aarch64-linux-gnu-g++ -v

看看是否已安裝完畢,接著可以作編譯 arm 版 hello.c 的程式,指令如:

~/prog $ arm-linux-gnueabihf-gcc hello.c -o hello_arm

接著檢查 hello_arm 是否為 ARM 之可執行檔:

~/prog $ file hello_arm
hello_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.18, BuildID[sha1]=ff5f6feea2e9b6d69384e8983758eb78c629276a, not stripped

確定有上面的檔案是 ARM 版可執行檔後,我們可以執行底下指令來驗證:

~/prog $ qemu-arm hello_arm
Hello World

接下來請執行底下指令,將 hello.c 編譯成 arm64 位元版本:

~/prog $ aarch64-linux-gnu-gcc hello.c -o hello_arm64


此時會編出一個 hello_arm64 的檔案,請執行底下指令來觀看此檔格式:

~/prog $ file hello_arm64
hello_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=6a5f0a968cea7ef12c8dfb9873772f1660ea0b6c, not stripped

要驗證此檔是否可執行,請執行:

~/prog $ qemu-aarch64 hello_arm64
Hello World


截至目前為止,我們已完成 armhf、arm64 之編譯工具安裝及驗收,這些工具將成為未來編譯 arm 核心、u-boot 的基本工具。


Q:什麼是 armel ? 什麼是 armhf ? 什麼是 arm64 ?






請依照
https://wiki.debian.org/CrossToolchains
https://wiki.debian.org/EmdebianToolchain
https://wiki.debian.org/Embedded_Debian
來安裝,20 分鐘驗收。


沒有留言:

張貼留言