Не означает ли ASLR перезагрузка DLL?

Я правильно понимаю, что в нашей сборке нет смысла восстанавливать наши DLL, если мы будем использовать ASLR, так как dlls снова будут пересозданы когда ядро ​​загружается?

Я обеспокоен тем, что наше приложение часто используется на машинах служб терминалов. Таким образом, если перезагрузка происходит во время загрузки, мы можем в конечном итоге переупаковать dll для каждого процесса, в который они загружены (будет один процесс за сеанс). И это приведет к увеличению использования памяти и поискового вызова, чем мы хотим заплатить. Мне нужно быть обеспокоенным?

Я нашел следующее сообщение в блоге, в котором говорится, что перезагрузка происходит только один раз, и она является системной: Matt Evans - включение ASLR для экономии памяти?. Я не видел никаких других ссылок об этом, поэтому просто хотел быть уверенным, что если я использую ASLR и не переустанавливаю во время нашей сборки, я не буду вызывать проблемы с памятью в окне служб терминалов?

Ответы

Ответ 1

Поэтому, основываясь на моем чтении, у вас не должно быть проблем. ASLR заставляет dll загружаться в полуаудитный адрес памяти и не должен начинать перезагрузку для каждого процесса. Если вы хотите проверить использование dll в памяти, есть бесплатный инструмент MassiveRebase, который позволяет динамически загружать две dll и просматривать информацию об их использовании в памяти. Он был разработан для просмотра изменений, которые могут быть сохранены в памяти. Инструмент и многое другое можно найти здесь: http://www.tmurgent.com/appv/index.php/en/resources/tools/137-massive-rebase

Надеюсь, это поможет.

Ответ 2

Rebasing все еще помогает. Когда операционная система загружается, она применяет фиксированное случайное значение к базе DLL.

В результате загружается DLL, типичная для одной загрузки, но отличается между машинами и загрузками.

Это означает, что данная DLL в большинстве процессов может быть разделена между процессами, поскольку все ее данные кода разделяются с тем же значением.

Когда DLL перемещается из-за того, что оно занимает адресное пространство, оно должно изменять исправления, и меньше DLL является общим, что увеличивает загрузку системы.

Если ваша DLL не является общей, то это не влияет на ресурсы.

Стоимость исправления DLL была дешевле, если она была загружена в нужное место, не уверен, что это верно для ASLR, но может сохранить время загрузки ресурсов.