2016-06-15 7 views
1

Что именно делает «исправления» при применении к разделу? В образце fasm я нашел следующий раздел delcaration, и я действительно не уверен, что делает атрибут fixups, я не мог найти много информации об этом в документации fasm.Как использовать атрибут fixups в разделе?

section '.reloc' fixups data readable discardable 
if $=$$ 
    dd 0,8   ; if there are no fixups, generate dummy entry 
end if 

ответ

4

Это оказывается обходным путем для bug in how FASM generates PECOFF DLLs. Раздел .reloc применим только к изображениям PECOFF (EXE и DLL) и предоставляет перемещение (или «исправления»), которые позволяют загружать изображение по любому адресу. (Переезды разного рода используются в объектных файлах PECOFF;. Эти fixups не помещаются в раздел .reloc)

Исправлена ​​ошибка в FASM является то, что он будет генерировать пустой .reloc раздел, если DLL не нуждается вместо того, чтобы не генерировать их вообще. Windows откажется загружать DLL (или EXE), если имеет пустой раздел. Обходной путь заставляет непустой раздел .reloc путем добавления фиктивного «базового блока перемещения», если раздел .reloc не содержит никакого содержимого.

Очевидно, разработчик FASM не считает, что это ошибка в FASM, а скорее ошибка в Windows, и поэтому не исправил ее.

Чтобы ответить на ваш вопрос напрямую, ключевое слово fixups указывает на то, что этот раздел является особым для FASM, что он используется для перемещения изображений, как описано выше. В отличие от других атрибутов он не соответствует одному из флажков раздела, используемых в изображениях PECOFF, поэтому он, по-видимому, используется только FASM.

+0

Большое спасибо за разъяснения, между спецификацией PE и этим подробным подробным ответом. Я получил все, что мне нужно! –

2

fixups это просто другое название для записей переселения.
Если вы новичок в перемещении по PE, take a look at the official specifications.


Записи переезда сообщают загрузчику, как исправить (отсюда и исправления имен) адреса в скомпилированном коде.

Директива fixups сообщает FASM, что объявленный раздел является тем, где должна быть сгенерирована запись перемещения (автоматически). Вы все равно можете добавить свои данные, предположительно, исправления написаны до того, как пользователь предоставит данные .

Тест if $=$$ проверить, соответствует ли счетчик текущего адреса ($) значению счетчика адресов при запуске раздела ($$).
Если это так, пользовательские данные будут записаны в начале раздела, поэтому никакие исправления не создаются.

Два слова dd 0, 8 создают пустую запись (фиктивная запись).
Второй DWORD указывает длину всей записи, включая 8-байтовый заголовок, значение 8 не указывает дополнительных данных.


Я не знаю, почему создается такая фиктивная запись.


Просто выводя это из сниппета, я не знаю точно.

+0

Спасибо за это, 6.6 в спецификации кажется отличной отправной точкой, чтобы понять все это! Я думаю, что чтение всей спецификации не повредит, когда у меня будет больше времени. –