2015年8月8日 星期六

Target Triple

剛好前鎮子有討論到 Target Triple 是啥鬼東西, 就順便整理一下,

在使用 Cross Compiler 的時候常常 gcc 前面會有一串名字,

例如 arm-none-linux-gnueabi-gcc 中的 arm-none-linux-gnueabi,

這東西其實真要說還真的沒啥正式的規則,

"通常"規則是 <target>[<endian>][-<vender>]-<os>[-<extra-info>]

然後這規則是自行歸納而來的並非啥正式規則

vendor 部份只是常見是可以塞 vendor 而已, 但沒有一定塞 vendor 的資訊
extra-info 部份大部份是在拿來描述用的 ABI 或著是 library 相關資訊

下面開使用一堆例子來用這規則來解讀
先以常見 x86 的平台為例子:
Fedora 22 上的 gcc (下 -v 可以看到)
Target: x86_64-redhat-linux
<target>-<vendor>-<os> 的形式

Ubuntu 14.04/i686 gcc
Target: i686-pc-linux-gnu
也是<target>-<vendor>-<os> 的形式

Android Toolchain:
Target: arm-linux-androideabi
<target>-<os>-<extra-info>
androideabi : 雖然 Android 本身是 Linux 但其 ABI 細節跟一般 linux 不太一樣

Linaro ELF toolchain:
Target: arm-none-eabi
<target>-<vender>-<extra-info>
vender = none
extra-info = eabi

Linaro Linux toolchain:
Target: arm-linux-gnueabihf
<target><endian>-<os>-<extra-info>
extra-info:
gnu: 沒啥特別意義
eabi: EABI
hf : Hard float, 預設有 FPU

Linaro big-endian Linux toolchain:
Target: armeb-linux-gnueabihf
<target><endian>-<vender>-<extra-info>
endian = be = big-endian

Buildroot 2015-02
Target: arm-buildroot-linux-uclibcgnueabi
<target>-<vender>-<os>-<extra-info>
extra-info:
uclibc 用 uclibc (通常預設是 glibc, uclibc 有些細節與 glibc 不同)
gnu : 無意義
eabi : 採用 EABI

NDS32 Toolchain:
Target: nds32le-elf
<target><endian>-<os>
Andes 家的,應該淺顯易懂不用解釋

由以上眾多 pattern 大概可以歸納出一些事情:
vender 那欄可以看上面的例子這部份完全可以亂填
os 那來可填可不填,不填"通常"代表 Non-OS (Bare-metal)

然後這鬼東西其實沒啥正式的規則
每個 target 可以按照自己開心的方式去處理
詳細部份可以參考 <gcc-src>/gcc/config.gcc [1]裡面有各種神秘規則

Reference

[1] https://github.com/gcc-mirror/gcc/blob/master/gcc/config.gcc