Whale 文档

工具链组件、可用命令和参考文档指南。

Wave Foundation

简介

Whale是一个用于编程语言实现和编译工具的通用编译器工具链。提供类型化中间表达式 (IR)、AMD64 汇编器、目标文件库和基于链接器的函数。每个组件都通过Rust库和whale命令使用。

IR 独立于机器语言编码表达计算的语义。汇编器对机器指令进行编码以创建可重定位对象。对象库代表部分、符号和重新排列。链接器解析对象之间的引用并放置可执行文件。

构建和使用工具

工作 文件
每个工具的作用 工具链组件
Wave 程序构建/链接/目标选择 构建和链接
包/依赖管理 Vex
Whale 执行命令 Whale CLI

文件指南

参考文件 内容
参见IR 类型、值、函数、控制流、验证、交换格式
数值运算 整数运算、移位、类型转换、浮点
内存模型 初始化、指针验证、地址计算、布局、字符串
使用 O0 进行调试 计算保留、变量存储、调试信息
AMD64 目标 目标标识符、调用约定、native函数范围
汇编器和链接器 汇编操作数、节、符号、静态链接

参考文档定义了Whale的语义规则。可用功能如下表所示。参考文档中描述的操作可能不适用于所有版本。

支持状态

组件 提供接口 限制
汇编器 从程序集 AMD64 创建ELF64 可重定位对象 命令和指令的覆盖不完整
对象库 对象组合、payload(不含 BSS)、目标验证、AMD64 ELF64 序列化和可选择的 Wave 记录实现以检查大小。 可重定位对象不是可执行文件
IR 构造、打印、签名检查直接/间接调用、版本化 AST 降低、目标验证和检查类型布局 AST/类型化IR格式2和位精确常量可用;输入 IR 解析和机器调用发射仍然不可用
连接器 符号解释、输入目标验证、文件/内存部分放置检查 不支持应用完全重定位和输出可执行文件。
运行与调试 本文档中定义的语义规则 IR解释器,完整的native代码生成,跟踪内存的运行时检查,DWARF不支持输出

禁止未定义行为的规则适用于经过验证的IR 和跟踪内存。实验实现尚未实现内存/执行参考文档中的所有运行时检查。

构建和组装

使用 Rust 1.86.0 或更高版本构建。

git clone https://github.com/wavefnd/Whale.git
cd Whale
cargo build --release --locked

将以下程序集另存为answer.asm。

section .text
global answer

answer:
    mov eax, 42
    ret

创建一个对象ELF64。

./target/release/whale asm --amd64 answer.asm -o answer.o

它使用Whale自己的汇编器,因此不需要外部汇编器。输出包含可调用函数,但不包含任何进程启动代码。

实验性的 AST→IR 命令可通过使用 --features socket-cli 进行构建来使用。 CLI的命令请参考命令参考。

库的使用和诊断

IR 必须在执行或代码生成之前进行验证。输入错误和误用builder将返回结构错误。库中的输入错误不得终止主机进程或覆盖现有内容。接受不受信任输入的工具应该能够调整资源限制。

相同的工具链版本、输入、目标和配置应该产生确定性的输出。该发行版的元数据标识了版本·commit·以及可用功能。 CI 检查良好输入、拒绝输入、trap、O0 保留、round-trip、native 每个接口的执行语义。开发/验证命令请参考Whale 贡献信息。