Должен ли я изменить свою базу изображений? - PullRequest
12 голосов
/ 14 мая 2009

В Delphi опция компоновщика Image Base по умолчанию имеет значение 00400000 .

За помощь:

Указывает предпочтительный адрес загрузки скомпилированного изображения. Это значение обычно изменяется только при компиляции Библиотеки DLL. По умолчанию = 400000

Нет ли эффекта для его изменения на EXE? Каков будет эффект? Адрес относится к каждому процессу?

Ответы [ 2 ]

28 голосов
/ 14 мая 2009

Исполняемые образы (EXE-файлы и библиотеки DLL и другие скрытые библиотеки DLL, такие как BPL и OCX), загружаются загрузчиком ОС по предпочтительному адресу загрузки ( База изображений ), если это возможно; если эта область виртуального адресного пространства зарезервирована для какой-либо другой цели (другой образ, стек потоков, выделение кучи), то загрузчик ОС перенесет образ. Перемещение изображения включает в себя размещение его где-то еще в адресном пространстве, затем взятие разницы между новым адресом загрузки и предпочтительным адресом загрузки и добавление этой разницы к каждому исправлению перемещения внутри изображения. Исправления перемещения указывают на все места в исполняемом образе, где код или данные ссылаются на себя, такие как загрузка кода из глобальных переменных или абсолютные переходы к другим подпрограммам.

Поскольку перемещение требует от ОС изменения версии данных образа в памяти, это занимает больше времени, занимает больше операций ввода-вывода и фиксирует больше страниц (весь образ с перемещениями должен быть выгружен), а также ОС Подсистема виртуальной памяти не сможет поделиться загруженным образом с другими процессами, которые загрузили один и тот же исполняемый образ (так как он будет другим в памяти). Таким образом, желательно избегать перемещения при загрузке.

Предпочтительным адресом для исполняемых образов является $00400000 по соглашению для 32-разрядных Windows, и другие библиотеки DLL (в том числе библиотеки ОС) основаны на этом соглашении, так как адреса загрузки по умолчанию не совпадают с основным исполняемым файлом. Таким образом они избегают переселения. На самом деле перемещение образа EXE выполняется так редко, что данные перемещения часто могут быть извлечены из образов EXE без вреда.

Изменение его для библиотек DLL имеет смысл, чтобы избежать конфликта с любой из стандартных библиотек ОС и любых других библиотек DLL, которые обычно поставляются с DLL / EXE. Поскольку изменение его для EXE увеличивает вероятность того, что ОС потребуется переместить DLL, не рекомендуется менять адрес загрузки EXE.

Компакторы исполняемых образов, такие как UPX , не рекомендуются для библиотек DLL, в частности, и для исполняемых файлов, которые могут иметь много запущенных экземпляров, потому что декомпрессия в памяти действует как перемещение в предотвращении того, чтобы образ в памяти общий для нескольких процессов.

3 голосов
/ 14 мая 2009

Смена базы изображений EXE практически бесполезна, если вы не делаете какой-то грязный взлом очень низкого уровня.

Является ли адрес относительно каждого процесса?

Да, каждый процесс имеет свое собственное адресное пространство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...