目标三元组是什么?· mcyoung

主要观点:介绍了交叉编译及目标三元组的相关内容,包括其历史、不同编译器的机制、各种架构的名称及变体、供应商和操作系统等方面,还对比了 Go 语言的做法,并给出了创建自己的目标三元组的建议。

关键信息和重要细节

  • 交叉编译:将计算机程序编译为非编译主机的机器的程序,所有严肃的原生编译器现在都是交叉编译器,LLVM 使目标三元组流行起来。
  • 目标三元组:形式为<机器>-<供应商>-<操作系统>,用于标识编译器可生成可执行代码的平台,LLVM 的目标三元组列表更官方,其来源包括主要编译器的使用和平台开发者的工具链。
  • 不同架构的名称:列举了多种架构的可能名称,如 x86(32 位和 64 位)、ARM(32 位、64 位、大端和小端等)、MIPS 等,且架构常有版本和功能变化,导致编译器生成代码的方式有所不同。
  • 供应商和操作系统:供应商用于标识 ABI 定义的责任方,常见的供应商有 unknown、pc、amd、apple 等;操作系统部分主要影响代码与操作系统的交互和链接细节,如 linux、windows、darwin 等。
  • ABI:目标三元组的第四部分,用于表示目标的二进制接口,不同操作系统和架构的 ABI 有所不同,会影响语言特性的处理。
  • WASM 目标:WebAssembly 的目标三元组通常只有两个组件,有 wasm32-unknown-unknown 和 wasm32-wasip1 等变体。
  • Go 语言的做法:Go 语言通过设置环境变量来指定目标,使用与其他语言不同的名称,如将 32 位和 64 位 x86 分别称为 386 和 amd64 等。
  • 创建自己的目标三元组:应避免在供应商字段添加内容,避免为现有架构发明新名称,对于独立环境可使用-none-<abi>,且要意识到目标三元组系统并非一致和易于解析。
阅读 50
0 条评论