Это мое понимание (в основном из Wikipedia's article в формате Portable Executable), что Windows DLL не используют независимый от позиции код и вместо этого имеют предпочтительный базовый адрес, определенный по ссылке. Если конфликты двух базовых адресов библиотек конфликтуют, необходимо переместить их через таблицу переселения.Перемещение DLL-файлов PE - время загрузки или подобное ELF?
Является ли это перемещение PE похожим на GOT и PLT ELF (локальные таблицы процесса в разделах .data, которые требуют, чтобы каждый абсолютный адрес проходил через косвенное), или это скорее похоже на динамическое перемещение (во время загрузки все абсолютные адреса переведены)? Если последнее, есть ли проблемы на x64?
Итак, для WIN32 перемещение выполняется во время загрузки, а затем во время выполнения ссылки на память являются прямыми? Как часто DLL требуют перемещения (если я загружаю библиотеку у какой-то третьей стороны, какова вероятность того, что она имеет информацию о перемещении)? –
В WIN64, даже с RIP-относительной адресацией, вам все еще нужны вещи, аналогичные GOT и PLT формата ELF? –
'Итак, для WIN32 перемещение выполняется во время загрузки, а затем во время выполнения ссылки на память являются прямыми? '- правильно. 'Как часто DLL требуют перемещения, что будет зависеть от нескольких вещей; был достаточно случайный адрес загрузки нагрузки? у вас не было других распространенных модулей, которые используют перекрывающийся диапазон адресов, как предпочтительный адрес? '(если я скачу библиотеку от какой-то третьей стороны, какова вероятность того, что она имеет информацию о перемещении)?' почти 100 процентов, они будут стрелять в ногу, иначе, если вы уже используете что-то еще по их адресу. –