Если я хочу перебазировать свои DLL, как мне это сделать?

Это продолжение этого вопроса.

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

Однако у моего плана, похоже, есть недостаток, и я не могу найти рабочий метод для определения рабочего набора адресов.

Я думал, что могу сделать следующее:

  1. Просто построить и NGEN все
  2. Запустите программу, убедившись, что все DLL были загружены
  3. Используйте LISTDLLS / R PROGRAMNAME, чтобы получить список текущих используемых адресов для работающего экземпляра
  4. Используйте адреса тех DLL, которые были переназначены в качестве нового базового адреса для этих DLL
  5. UN-NGEN все, и начать с 1

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

Например, предположим, что после первоначального запуска у меня есть список, в котором говорится, что библиотеки A, B и C должны находиться по адресам 1000, 2000 и 3000. Там нет упоминаний о библиотеках D, E и F, которые также являются частью та же система. Предположительно они были загружены в их текущем базовом адресе, в противном случае я бы предположил, что LISTDLLS расскажет мне об этом.

Поэтому я меняю адрес A, B, C, повторяю все, и теперь DLL C, D и E были перемещены. A и B теперь в порядке, E и F теперь перемещены, а C все еще перемешивается.

Я понимаю, что это упражнение несколько бесполезно, поскольку независимо от того, что я выясняю на моей машине, библиотеки DLL, используемые и внедряемые на целевом терминальном сервере, могут нарушить эту картину, но я подумал, что если я хотя бы смог убедиться, что некоторые из Библиотеки DLL могут быть расположены по их предписанному базовому адресу, тогда объем общего кода между несколькими экземплярами одной и той же программы увеличится. Просто говорю, просто чтобы не было необходимости "напоминать" мне об этом:)

Поскольку исходные базовые адреса всех наших DLL были по умолчанию, что означало, что каждая DLL (возможно, кроме первой загруженной) была перемещена и, таким образом, сопоставлена ​​с файлом подкачки, я думаю, что потенциальный выигрыш будет выше 0.

Любой совет?

1 ответ

Решение

С помощью DUMPBIN (входит в Visual Studio) вы можете узнать, какие библиотеки DLL предпочитают загружать адрес и диапазоны памяти, и выполнять планирование на основе этих чисел.

dumpbin / headers даст вам:

 7DC90000 image base (7DC90000 to 7DD5FFFF)

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

Другие вопросы по тегам