在使用 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]裡面有各種神秘規則
沒有留言:
張貼留言