什么是一 .rel 文件?
具有 .rel 扩展名的文件可用于多种用途。因此,在游戏分类方面,它被称为一些 Nintendo Wii 游戏使用的可重定位模块文件,例如 Brawl、Super Smash Bros 和 Mario Kart Wii。它包含游戏数据,包括角色模型和阶段。 REL 文件的执行方式与 Microsoft Windows 使用的 .DLL 文件类似。
REL 文件格式
在 REL 文件格式中,文件分为几个部分,按类似的访问权限分组,例如,一个部分中的只读数据,所有可执行代码都放在另一个部分中,等等。文件以标题部分开头,后面是:
- 包含部分信息的表格。
- 部分数据。
- 搬迁信息。
文件头
该文件以最多 0x4C 字节的标头开头:
偏移 | 尺寸 | 字段名称 | 说明 |
---|---|---|---|
0x00 | 4 | 编号 | 任意识别号。在游戏使用的所有 REL 中必须是唯一的。不得为 0。 |
0x04 | 4 | 下一个 | 指向下一个模块的指针,在运行时填充。 |
0x08 | 4 | 上一页 | 指向前一个模块的指针,在运行时填充。 |
0x0c | 4 | numSections | 文件中的节数。 |
0x10 | 4 | sectionInfoOffset | 到截面表开始处的偏移量。 |
0x14 | 4 | 名称偏移 | 偏移到包含模块名称的 ASCII 字符串。可能为 NULL。相对于 REL 文件的开头。 |
0x18 | 4 | 名称大小 | 模块名称的大小(以字节为单位)。 |
0x1c | 4 | 版本 | REL 文件格式的版本号。 |
0x20 | 4 | 大小 | “.bss"部分的大小。 |
0x24 | 4 | 相对偏移 | 重定位表的偏移量。 |
0x28 | 4 | impOffset | 小鬼表的偏移量。 |
0x2c | 4 | 小尺寸 | imp 表的大小(以字节为单位)。 |
0x30 | 1 | 序言部分 | 索引到 prolog 相对的节表。如果此字段为 0,则跳过。 |
0x31 | 1 | 结语部分 | 索引到与 Epilog 相关的节表中。如果此字段为 0,则跳过。 |
0x32 | 1 | 未解决部分 | 索引到未解析的相对于节表。如果此字段为 0,则跳过。 |
0x33 | 1 | bss部分 | 索引到 bss 相对的节表。在运行时填充! |
0x34 | 4 | 序言 | 偏移到 _prolog 函数的指定部分。 |
0x38 | 4 | 结语 | 偏移到 _epilog 函数的指定部分。 |
0x3c | 4 | 未解决 | 偏移到 _unresolved 函数的指定部分。 |
0x40 | 4 | 对齐 | 仅限版本 ≥ 2。所有部分的对齐约束,表示为 2 的幂。 |
0x44 | 4 | bss对齐 | 仅限版本 ≥ 2。所有 ‘.bss’ 部分的对齐约束,表示为 2 的幂。 |
0x48 | 4 | 固定尺寸 | 仅限版本 ≥ 3。如果 REL 与 OSLinkFixed(而不是 OSLink)链接,则此地址后面的空间可用于其他目的(如 BSS)。 |
部分信息表
部分信息表包含 numSections 条目,每个 0x8 字节长:
偏移 | 尺寸 | 说明 |
---|---|---|
0x0 | 30 位 | 从 REL 开始到该部分的偏移量。如果为零,则该部分是未初始化的部分(即.bss)。 |
0x3.6 | 1 位 | 未知。 |
0x3.7 | 1 位 | 可执行标志;如果这是 1,则该部分是可执行的。 |
0x4 | 4 | 节的字节长度。如果为零,则跳过此条目。 |
0x8 | 下一个条目 | 下一个条目 |
搬迁数据
重定位数据是一个或多个 0x8 字节结构的列表。每个列表的末尾都标有特殊类型代码 203:
偏移 | 姓名 | 尺寸 | 说明 |
---|---|---|---|
0x0 | 偏移 | 2 | 从上一个重定位到这个的偏移量(以字节为单位)。如果这是节中的第一次重定位,则这是相对于节开始的。 |
0x2 | 类型 | 1 | 重定位类型。如下面所描述的。 |
0x3 | 部分 | 1 | 要重定位的符号部分。对于特殊的重定位类型 202,这是该文件中以下重定位条目适用的节的编号。 |
0x4 | 加 | 4 | 要重定位的符号的字节偏移量,相对于其部分的开头。这是一个绝对地址,而不是针对 main.dol 的重定位。 |
0x8 | 下一个条目 | 下一个条目 | 下一个条目 |