Я должен изменить свой Базовый адрес образа?

Лямбда-выражение в исходном коде фактически не компилируется непосредственно в объект; это скорее инструкция к среде выполнения для создания лямбды. У JVM есть много свободы относительно лямбд; так что, возможно, речь о предметах неприменима в этом контексте.

Фактическое число создаваемых объектов сильно зависит от тела лямбды и реализации JVM.

В JLS § 15.27.4 упоминается следующее:

  • Новый объект не обязательно размещать при каждой оценке.
  • Объекты, созданные различными лямбда-выражениями, не обязательно должны принадлежать разным классам (например, если тела идентичны).
  • Каждый объект, полученный в результате оценки, не обязательно должен принадлежать одному и тому же классу (например, захваченные локальные переменные могут быть встроены).
  • Если «существующий экземпляр» доступен, его не нужно было создавать при предыдущей лямбда-оценке (например, он мог быть выделен во время инициализации окружающего класса).
blockquote>

См .:

12
задан Jim McKeeth 14 May 2009 в 00:53
поделиться

2 ответа

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

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

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

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

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

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

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

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

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

28
ответ дан 2 December 2019 в 04:53
поделиться

Change EXE's image base is almost useless unless you're doing some very low-level dirty hack.

Is the address relative to each process?

Yes, each process has its own address space.

3
ответ дан 2 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: