1 个不稳定版本
0.1.0 | 2021 年 7 月 10 日 |
---|
#581 in 调试
695KB
17K SLoC
Glulxtoc - Glulx 转 C 反编译器
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