LostOdysseyRecomp跳表处理指南:XenonAnalyse、手工配置与自动脚本如何协同处理switch table
发布时间:2026/10/27 1:20:47 锦皓数字建站

【免费下载链接】LostOdysseyRecompExperimental native PC port of Lost Odyssey using static recompilation. No game assets included.项目地址https://gitcode.com/gh_mirrors/lo/LostOdysseyRecomp点击查看免费下载本文带你完整看懂LostOdysseyRecomp跳表jump table / switch table的处理流水线。LostOdysseyRecomp 是一个基于静态重编译的《失落的奥德赛》Lost Odyssey实验性 PC 移植项目。由于 XenonPowerPC指令集中存在大量通过bctr完成的计算跳转重编译器必须清楚每张跳表跳到哪些地址——自动发现、手工补全与自动化脚本三者缺一不可。什么是跳表为什么它对重编译器至关重要跳表是编译器为 switch 分派生成的地址数组CPU 以寄存器值作索引从表中取出目标地址后再用bctr跳转过去。在这款游戏 14.3 MB 的.text代码里共有841 张这样的表。如果重编译器识别不出跳表会出现两类事故bctr被误当成尾调用函数边界被截短被截断函数内部的b指令变成跳出函数的未解析目标项目实测首轮就有 91 个 switch 站点、96 个未解析目标。换句话说跳表配置的质量直接决定重编译输出是否完整也就决定了游戏能不能稳定运行。自动发现XenonAnalyse 生成 switch_tables.tomlXenonAnalyse 是项目 XenonRecomp 工具链自带的静态分析器由 build_tools.bat 一并编译它借助 XEX 镜像中的.pdata函数表划定函数边界自动扫描跳表并把结果写入 switch_tables.toml约 2 万行、841 张绝对地址表。每张表记录 4 个字段字段含义base读表的跳转指令所在代码地址索引在此处算出r充当表索引的寄存器default越界时的默认分支labels表中每一项的目标地址该文件通过主配置 LostOdysseyRecomp.toml 中的switch_table_file_path switch_tables.toml字段被重编译器引用。手工补全switch_tables_manual.toml 里的漏网之鱼自动检测不可能覆盖所有写法XenonAnalyse 漏掉的表就手工写进 switch_tables_manual.toml。目前手工补了 2 张表① 战斗环 UI 跳表—— 第一张手工表对应下面这张战斗场景[[switch]] base 0x82B14808 r 10 default 0x82B148BC labels [0x82B14830, 0x82B14878, 0x82B14890, 0x82B148A4]文件注释写明了后果不补这张表bctr会被当成尾调用从而跳过栈恢复逻辑。② u16 短偏移跳表—— 基址 0x82FB21AC、16 项的相对偏移表。XenonAnalyse 只识别绝对地址表这种 16 位偏移写法它发现不了只能人工列出全部 16 个标签。⚠️ 一个容易踩的坑switch_tables.toml每次重跑 XenonAnalyse 都会重新生成所以重新生成后必须把手工文件的内容再次 append到它末尾——文件头注释里也写明了这条规则。自动脚本gen_function_bounds.py 把跳表变成函数边界gen_function_bounds.py约 170 行解决带跳表的函数被截短这一连锁问题核心有 5 条规则累积未解析目标重编译输出中的// ERROR addr目标各自成为一个新函数跨轮累积在config/branch_targets.txt补全 .pdata 之外的表每张labels未被所属.pdata函数覆盖的跳表都从表前最近符号生成一个函数一直延伸到最远标签之后的下一个符号手工条目function_bounds_manual.txt 中目前一条827C39F8 18——否则这个小桩会流进后面的 pdata 函数抢走它的跳表指针专属函数只被虚表/函数指针表引用、不在.pdata也不被bl指向的函数边界分析完全看不见会被并进前一个函数尾部运行时虚函数调用直接跳到地址 0 崩溃。脚本扫描整个镜像的 4 字节对齐指针并用基线映射表baseline_func_mapping.txt过滤误报最终命中 43 个代码中物化的地址lisaddi/ori在 64 字节窗口内拼出的地址被识别为运行时写入对象的函数指针。生成结果写入主配置的functions [...]列表116 项含 47 个指针专属函数。协同流程三步配合迭代到收敛三个环节串成一条自动 手工 脚本的流水线约 8 轮迭代后收敛到 0 错误步骤动作验收标准1跑 XenonAnalyse重新生成switch_tables.toml得到 841 张表2漏检表补进switch_tables_manual.toml再 append 到自动文件末尾grep -l // ERROR ppc/*.cpp返回 03gen_function_bounds.py生成functions边界列表未解析目标数逐轮下降4python -B tools/ppc_codegen.py generate重新生成客制代码0 未解析目标、0 跳表错误整个过程含invalid_instructions对异常处理描述符的跳过——不跳过它们pass2 边界分析会把描述符当代码在带跳表的函数上死循环都有完整记录可查阅专题笔记 recomp.zh-CN.md 与构建说明 BUILDING.md。相关文件路径速查自动跳表switch_tables.toml手工跳表switch_tables_manual.toml主配置functions、midasm_hook、invalid_instructionsLostOdysseyRecomp.toml手工函数边界条目function_bounds_manual.txt边界生成脚本gen_function_bounds.py工具链构建脚本build_tools.bat代码生成入口ppc_codegen.py专题笔记recomp.zh-CN.md、BUILDING.md 一句话总结XenonAnalyse 负责量大面广的自动检测手工 TOML 兜住自动化的盲区gen_function_bounds.py再把跳表信息转化为精确的函数边界——三者协同才能让 14 MB 的 Xenon 代码被完整、可运行地重编译到 PC 上。赞分享【免费下载链接】LostOdysseyRecompExperimental native PC port of Lost Odyssey using static recompilation. No game assets included.项目地址https://gitcode.com/gh_mirrors/lo/LostOdysseyRecomp点击查看免费下载相关推荐如何在10分钟内快速上手CSLA框架新手必备指南如何在10分钟内快速上手CSLA框架新手必备指南 CSLA框架是.NET应用程序中业务逻辑的理想家园它提供了一套完整的架构模式和工具帮助开发者构建强大、可软件架构后端TaskbarX命令行批处理脚本多任务自动化配置指南TaskbarX命令行批处理脚本多任务自动化配置指南 痛点与解决方案 Windows任务栏图标默认靠左对齐手动调整位置和样式不仅繁琐多显示器环境下的配置同桌面应用如何备份QQ空间3步免费导出全部历史说说到Excel如何备份QQ空间3步免费导出全部历史说说到Excel 想找回大学时写的那批说说在QQ空间里一条条往上翻翻到手指发酸还是嫌慢。试试 GetQzonehist网页爬虫数据分析上一篇PasteMD一键解决Markdown到Office格式转换的终极方案下一篇AscendNPU IR 语言生态接入指南Triton、TileLang、DLCompiler 与 FlagTree 实战详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。