1 个不稳定版本

0.1.0 2021 年 7 月 10 日

#581 in 调试

MIT 许可证

695KB
17K SLoC

C 10K SLoC // 0.1% comments Rust 5K SLoC // 0.1% comments Python 835 SLoC // 0.2% comments Objective-C 445 SLoC // 0.1% comments

Glulxtoc - Glulx 转 C 反编译器

Glulxtoc logo

Glulxtoc 会将你的 Glulx 故事文件反编译成 C 代码,然后你可以将其编译到任何 Glk 库中。

获取它,首先 安装 Rust,然后使用 cargo 安装 glulxtoc

cargo install glulxtoc

用法

glulxtoc <path> [FLAGS] [OPTIONS]

必需选项

  • 故事文件的路径

标志

  • -d, --disassemble:反汇编模式 - 仅进行反汇编,不优化或生成结构化代码

选项

  • --debug-file:故事文件 Inform 调试文件的路径
  • --out-dir:输出文件夹。如果没有提供,将基于故事文件名创建文件夹,并在末尾添加 .decompiled
  • --stack-size:堆栈大小(单位 MB,默认 8),用于 glulxtoc 应用程序(而不是正在反编译的 Glulx 文件的堆栈)。非常大的故事文件可能导致 glulxtoc 应用程序出现堆栈溢出,在这种情况下请传递此选项。
  • --safe-function-overrides:强制设置为安全的函数地址数组,覆盖反编译器的启发式算法。例如,--safe-function-overrides=1234,5678
  • --unsafe-function-overrides:强制设置为不安全的函数地址数组,覆盖反编译器的启发式算法。

编译输出代码

Glulxtoc 生成多个 C 文件并提供 CMake 的 CMakeLists.txt 文件。您必须将 Glk 库的路径传递给 CMake。例如

glulxtoc advent.ulx
cd advent.ulx.decompiled
mkdir remglk
cmake -DGlkLibPath=../../remglk . -B remglk
cd remglk
make

限制

通常,Glulxtoc 可能会与未使用 Inform 编译的任何 Glulx 文件出现问题。

  • RAM 中没有函数
  • 函数和字符串不能交错 - 一旦找到第一个字符串,解码就会停止
  • 没有 1 和 2 字节的局部变量
  • 仅当您手动将目标函数设置为不安全时才支持函数间分支
  • 字符串调用函数内的状态改变操作码(保存、重启等)

故障排除

  • 如果在反编译阶段出现错误(例如未知操作码),请尝试传入一个Inform调试文件。如果您提供了,请考虑使用reduce-debug-xml.sh工具来缩减调试数据,只保留Glulxtoc所使用的数据。这不是必需的,但会使Glulxtoc运行更快。
  • 如果编译过程中的make阶段非常慢,请尝试使用Clang。GCC存在一个错误,这使得Glulxtoc的输出编译非常慢。
  • 如果编译没有错误,但运行不正常,尝试将Glulxtoc切换到反汇编模式(-d),看是否解决问题。如果是这样,则表明Glulxtoc的反编译优化代码中存在错误。

如果您确实遇到了错误,请尽量提供尽可能详细的错误报告,并最好附带您的storyfile。

依赖项

~6.5MB
~107K SLoC