.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 | Следующая запись | Следующая запись | Следующая запись |