1 个不稳定版本

0.1.0 2022年12月13日

#523 in 编程语言

GPL-2.0-or-later

96KB
1.5K SLoC

可扩展汇编库

libxas,一个基于Rust的快速、开源、贝尔风格的汇编器

待办事项:链接、目录

可扩展汇编库,或称 libxas,是汇编程序员、工具链编写者、虚拟化/仿真爱好者等的强大工具。使用其强大的、高效的且易于集成的Rust栈,libxas允许任何人轻松地为不同平台编写汇编代码,快速将其编译成多种不同的输出格式,并编写扩展来扩展库的功能。它是

  • 快速。libxas专注于速度。使用零成本抽象提供稳健、可扩展的平台,而不牺牲速度。
  • 安全。由于是用Rust编写的,libxas具有高安全性和低漏洞潜力。这对于需要完全安全、无法逃脱的环境来使用操作码功能进行外国数据转换的环境尤为重要。
  • 可扩展。libxas栈可以轻松扩展以编写汇编器、构建工具链以及集成新的架构和输出格式。

(待办事项:栈图)

libxas栈被设计成尽可能可扩展和模块化。单个输出格式、输入架构以及各种功能都易于禁用和编译。

BBU

BBU - "Better Binutils" - 是libxas的核心。它包含各种ISA后端、操作码翻译和优化,以及输出过程中传递的任何特定架构信息。它还包含 outs,一个模块化的输出文件系统,允许轻松实现针对各种目标文件格式的新的架构。

EAF

libxas的大部分用例都涉及简单地使用现有的工具链来汇编来自各种来源的行。EAF - "Easy AFrontend" - 显著简化了此过程。它提供了一个健壮的API,允许Rust程序链接,从而抽象掉libxas的所有繁琐内部细节,并呈现一个干净的开发前端。使用libxas中使用的格式信息系统 Platform,输入和输出缓冲区之间自动处理所有内容。

XASP

可扩展汇编器语法处理器由两个内部模块组成:处理宏识别和指令格式的 解析器,以及帮助将宏和指令转换为BBU模块结构的 词法分析器。这些通过强大的Rust泛型功能实现极端灵活性,允许无缝集成复杂架构。

哲学

确实存在一些情况,需要为“了解内情的人”构建工具链。LLVM和GCC工具链表现非常出色,并设计用于在编译器创建的所有阶段实现完全集成。像LLVM IR这样的工具提供了强大的抽象和优化。对于前沿的编译器,这些紧密集成的工具链和库至关重要。然而,并非每个用例都需要下一个GCC。通常,人们只需要简单且易于开发的工具。在处理汇编时,这一点尤为重要;汇编开发时间非常长,因此应尽量减少与工具链的工作时间。

为了确保任何人都能快速且无痛苦地使用libxas,我们致力于提供简单、高度文档化的接口。对于任何有新输出格式或ISA想法的人来说,都不必担心开发原型或稳定的生产工具链的初始时间。

许可和库

libxas采用GNU通用公共许可证,版本2(或,根据您的选择,任何更高版本)。这是为了确保用户自由,同时保证派生版本对整个社区可用。

我们还使用了以下库,它们有自己的相应许可

  • log: v0.4.17, MIT 和/或 Apache-2.0
  • num_traits: v0.2.15, MIT 和/或 Apache-2.0

用法

如果您想使用堆栈的各个部分,请查看它们的(待定)文档。否则,您可能需要了解如何使用EAF。

  1. 创建Cargo项目,并将libxas作为依赖项添加。
  2. 将汇编存储在一个String中。如果您正在处理文件,请使用std::fs::read_to_string或类似的方法。
  3. 使用创建函数之一创建一个platform::Platform实例。
  4. 使用您的汇编和Platform调用eaf::assemble_full_source
  5. 读取/存储结果为Vec<u8>作为您的输出。

贡献

我们始终欢迎贡献,并非常感激。您可以

  • 在问题中报告错误并提出新功能
  • 解决TODOs/FIXMEs/NOTEs或做出其他贡献(请提交拉取请求)
  • 帮助文档化libxas(说明待定)

兼容性

libxas需要Rust稳定版≥ v1.56.1或较新的夜间版本。这是因为我们使用Rust Edition 2021。您可以尝试将Rust版本更改为2018并在较低版本上运行,但这不受支持。

架构支持

chip8-raw chip8
rawbin

依赖关系

~240KB