.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 | предыдущий | Указатель на предыдущий модуль, заполненный во время выполнения. |
| 0x0с | 4 | числоСекций | Количество разделов в файле. |
| 0x10 | 4 | разделИнформацияСмещение | Смещение к началу таблицы разделов. |
| 0x14 | 4 | имяOffset | Смещение к строке ASCII, содержащей имя модуля. Может быть NULL. Относительно начала файла REL. |
| 0x18 | 4 | имяРазмер | Размер имени модуля в байтах. |
| 0x1с | 4 | версия | Номер версии формата файла REL. |
| 0x20 | 4 | bssРазмер | Размер раздела ‘.bss’. |
| 0x24 | 4 | отн. смещение | Смещение к таблице перемещений. |
| 0x28 | 4 | импСмещение | Смещение к таблице имп. |
| 0x2с | 4 | импРазмер | Размер таблицы импов в байтах. |
| 0x30 | 1 | прологРаздел | Индекс в таблице разделов, относительно которой пролог. Пропустить, если это поле равно 0. |
| 0x31 | 1 | эпилогРаздел | Укажите в таблице разделов, к какому эпилогу относится. Пропустить, если это поле равно 0. |
| 0x32 | 1 | неразрешенныйраздел | Указатель в таблицу разделов, к которой относится unresolved. Пропустить, если это поле равно 0. |
| 0x33 | 1 | bsРаздел | Укажите в таблице разделов, относительно которой находится bss. Заполняется во время выполнения! |
| 0x34 | 4 | пролог | Смещение в указанный раздел функции _prolog. |
| 0x38 | 4 | эпилог | Смещение в указанный раздел функции _epilog. |
| 0x3c | 4 | нерешенный | Смещение в указанный раздел функции _unresolved. |
| 0x40 | 4 | выровнять | Только версия ≥ 2. Ограничение выравнивания для всех разделов, выраженное как степень числа 2. |
| 0x44 | 4 | bssAlign | Только версия ≥ 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 | Следующая запись | Следующая запись | Следующая запись |