Що таке файл REL?
Файл із розширенням .rel можна використовувати для різних цілей. Тому, з точки зору класифікації ігор, він відомий як переміщуваний модульний файл, який використовується в деяких іграх Nintendo Wii, таких як Brawl, Super Smash Bros і Mario Kart Wii. Він містить дані ігрового процесу, включаючи моделі персонажів і етапи. Файли REL працюють подібно до файлів .DLL, які використовуються в Microsoft Windows.
Формат файлу REL
У форматі файлу REL файл поділено на кілька розділів, згрупованих за однаковим доступом, наприклад, дані лише для читання в одному розділі, увесь виконуваний код розміщується в іншому тощо. Файл починається із розділу заголовка, після якого йде:
- Таблиця, що містить інформацію про розділ.
- Дані розділу.
- Інформація про переїзд.
Заголовок файлу
Файл починається із заголовка розміром до 0x4C байтів:
Зсув | Розмір | Назва поля | Опис |
---|---|---|---|
0x00 | 4 | ідентифікатор | Довільний ідентифікаційний номер. Має бути унікальним серед усіх REL, які використовуються в грі. Не має бути 0. |
0x04 | 4 | наступний | Покажчик на наступний модуль, заповнений під час виконання. |
0x08 | 4 | попередній | Покажчик на попередній модуль, заповнений під час виконання. |
0x0c | 4 | кількістьрозділів | Кількість розділів у файлі. |
0x10 | 4 | розділInfoOffset | Зсув до початку таблиці розділу. |
0x14 | 4 | nameOffset | Зсув до рядка ASCII, що містить назву модуля. Може мати значення NULL. Відносно початку файлу REL. |
0x18 | 4 | назва Розмір | Розмір імені модуля в байтах. |
0x1c | 4 | версія | Номер версії формату файлу REL. |
0x20 | 4 | bssize | Розмір розділу «.bss». |
0x24 | 4 | relOffset | Зсув до таблиці переміщення. |
0x28 | 4 | impOffset | Зсув до таблиці imp. |
0x2c | 4 | impSize | Розмір таблиці imp в байтах. |
0x30 | 1 | prologSection | Індекс до таблиці розділів, до якого відноситься пролог. Пропустити, якщо це поле дорівнює 0. |
0x31 | 1 | epilogSection | Індексуйте в таблицю розділів, до якого відноситься епілог. Пропустити, якщо це поле дорівнює 0. |
0x32 | 1 | unresolvedSection | Індекс до розділу таблиці, до якого відноситься невирішене. Пропустити, якщо це поле дорівнює 0. |
0x33 | 1 | bssSection | Індекс до таблиці розділів, відносно якого bss. Заповнюється під час виконання! |
0x34 | 4 | пролог | Зсув у вказаний розділ функції _prolog. |
0x38 | 4 | епілог | Зсув у вказаний розділ функції _epilog. |
0x3c | 4 | невирішені | Зсув у вказаний розділ функції _unresolved. |
0x40 | 4 | вирівняти | Тільки версія ≥ 2. Обмеження вирівнювання для всіх розділів, виражене як ступінь 2. |
0x44 | 4 | bssAlign | Тільки версія ≥ 2. Обмеження вирівнювання для всіх розділів «.bss», виражене як ступінь 2. |
0x48 | 4 | fixSize | Тільки версія ≥ 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 | Наступний запис | Наступний запис | Наступний запис |