GCC目标三元组(Target Triplet)
如果只开发x86平台的软件,通常不需要关心Target Triplet,但是对于嵌入式开发,必须要理解什么是Target Triplet,从而才能选择正确版本的GCC交差编译器。
Target Triplet是Autoconf的概念,用于描述最终代码运行的目标平台。GCC本身也采用Autoconf构建,因此最终生成的编译器命令也是这种方式命名,比如x86_64-unknown-linux-gnu,arm-none-eabi,arm-none-linux-eabi,aarch64-linux-gnu,riscv64-unknown-linux-gnu,riscv64-unknown-elf等。通过命令gcc -dumpmachine可以查看。
Target triplet由三个字段组成,格式如下:
CPU-vendor-operatingsystem
其中:
- machine:目标CPU family/model,比如riscv64、x86_64、aarch64。
- vendor:一般32-bit x86是pc,其他的是’unknown’或’none’。vendor字段不重要,有时会省略。
- operatingsystem:目标操作系统,其差异在于编译器提供的用户态环境,如标准头文件和运行时库。其格式为[KERNEL]-OS,KERNEL字段可省略,比如linux-gnu,表示目标平台为linux内核的gnu系统。有时operatingsystem字段为elf,表示生成的代码与OS无关,适用于开发bare metal的软件,如BootLoader、kernel。ARM平台该字段会使用目标ABI名称,比如eabi表示采用EABI并且和OS无关(即适用于bare metal开发),linux-gnueabi表示采用EABI并且是基于Linux内核的gnu系统。
由于operatingsystem可能包含两个子字段,而vendor又可省略,所以解读Target Triplet时要注意区分。
在编译GCC时,configure的–target=参数接受一个目标平台的配置,不同的配置会影响编译器的行为和生成的目标代码。所有的target config列在contrib/config-list.mk中,比如riscv64-unknown-linux-gnu。
参考链接:
https://wiki.osdev.org/Target_Triplet
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Specifying-Target-Triplets.html