2013-07-27 5 views
5

Какие именно шаги предпринимаются компоновщиком при разрешении перемещений в объектном файле перед созданием окончательного изображения? Более конкретно, как линкер обрабатывает значение, которое уже хранится на сайте переселения? Всегда ли он добавляет его в окончательный VA/RVA или иногда игнорируется (например, некоторые типы переселения)?Как работают репозиции в файлах COFF (не изображения)

Я не мог найти четкое объяснение в MS PE/COFF Specfication, и после того, как прибегая к помощи и экспериментировать на некоторое время, все, что я мог бы узнать, был это:

  1. В спецификации MS CO, глава 5.6.2 " Базовые типы переадресации ", сказано, что« Перемещение базы применяет все 32 бита разницы к 32-битовому полю со смещением », что, я думаю, означает, что перемещение должно учитывать любой адрес, уже сохраненный с указанным смещением , Однако глава 5.6 (раздел .reloc) относится только к файлам изображений, а не к объектным файлам.
  2. Утилита dumpbin добавляет столбец с именем «Applied To» при печати таблицы перемещений, которая, как представляется, всегда (независимо от типа перемещения) содержит значение, которое хранится на сайте перемещения.
  3. В Relocation Directives chapter in the DJGPP COFF Specification четко указано, что значение, которое в настоящее время хранится в местоположении, должно быть добавлено к адресу символа, на который указывает запись таблицы перемещений.

Можете ли вы указать мне на любую (релевантную) документацию, которая объясняет, как репозиции обрабатываются компоновщиком?

+0

Не подходит ли раздел для объектных файлов 4.2 «Перемещение COFF», а не раздел 5.6.2, который предназначен только для файлов изображений? – legalize

+0

Это должно быть, но в разделе 4.2 не объясняется, что делать, если сайт переселения имеет значение, отличное от 0, хранящееся в нем, что на самом деле довольно распространено, и его можно легко увидеть с помощью dumpbin. – user2625389

ответ

5

Раздел перемещения, используемый в «файлах изображений», имеет немного другую цель из информации о перемещении, присутствующей в «объектных файлах».

В отличие от общих библиотек Linux, Windows DLL обычно не использует независимый от позиции код. Вместо этого они определяются относительно фиксированного адреса. Однако загрузчик Windows имеет возможность переместить DLL в случае конфликта. Для этого DLL-изображения содержат разделы перемещения, которые определяют, какие данные необходимо изменить при перемещении изображения. Многие ссылки на символы внутри dll будут использовать относительную адресацию «eip» (или rip), поэтому им может не потребоваться изменение при перестановке DLL.

Перемещение файлов изображений всегда указывается относительно базового адреса исполняемого изображения. Перемещение объектных файлов указывается относительно адреса (внутри изображения, используя предпочтительный адрес изображения) символа в таблице символов. Файлы изображений не имеют таблицы символов (они имеют IAT, но это не таблица символов). Набор поддерживаемых перемещений в объектных файлах богаче, чем набор, поддерживаемый в файлах изображений.

Детали описаны в разделе «Перемещение COFF (только объект)» спецификации PE/COFF (я смотрю версию 3, когда я печатаю это).