2015-10-30 4 views
1

Это мое понимание (в основном из Wikipedia's article в формате Portable Executable), что Windows DLL не используют независимый от позиции код и вместо этого имеют предпочтительный базовый адрес, определенный по ссылке. Если конфликты двух базовых адресов библиотек конфликтуют, необходимо переместить их через таблицу переселения.Перемещение DLL-файлов PE - время загрузки или подобное ELF?

Является ли это перемещение PE похожим на GOT и PLT ELF (локальные таблицы процесса в разделах .data, которые требуют, чтобы каждый абсолютный адрес проходил через косвенное), или это скорее похоже на динамическое перемещение (во время загрузки все абсолютные адреса переведены)? Если последнее, есть ли проблемы на x64?

ответ

1

Ситуация другая между WIN32 и WIN64.

Для изображений WIN32, в которых присутствует информация о перемещении (обычно не в EXE), все абсолютные адреса в двоичном коде имеют соответствующую запись фиксации, так что адрес может быть исправлен загрузчиком в случае, если предпочтительная загрузка модуля адрес уже занят чем-то другим.

Для изображений в формате WIN64 ситуация в принципе похожа, но на самом деле почти все 64-разрядные инструкции фактически используют независимую от позиции кодировку, где смещения являются относительными по IP-адресу, а не абсолютными, поэтому требуется меньше исправлений для перемещения (если вообще).

+0

Итак, для WIN32 перемещение выполняется во время загрузки, а затем во время выполнения ссылки на память являются прямыми? Как часто DLL требуют перемещения (если я загружаю библиотеку у какой-то третьей стороны, какова вероятность того, что она имеет информацию о перемещении)? –

+0

В WIN64, даже с RIP-относительной адресацией, вам все еще нужны вещи, аналогичные GOT и PLT формата ELF? –

+0

'Итак, для WIN32 перемещение выполняется во время загрузки, а затем во время выполнения ссылки на память являются прямыми? '- правильно. 'Как часто DLL требуют перемещения, что будет зависеть от нескольких вещей; был достаточно случайный адрес загрузки нагрузки? у вас не было других распространенных модулей, которые используют перекрывающийся диапазон адресов, как предпочтительный адрес? '(если я скачу библиотеку от какой-то третьей стороны, какова вероятность того, что она имеет информацию о перемещении)?' почти 100 процентов, они будут стрелять в ногу, иначе, если вы уже используете что-то еще по их адресу. –