顯示具有 cross build 標籤的文章。 顯示所有文章
顯示具有 cross build 標籤的文章。 顯示所有文章

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 分鐘驗收。