Если я хочу перебазировать свои DLL, как мне это сделать? - PullRequest
1 голос
/ 12 февраля 2009

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

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

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

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

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

Однако, это превратилось в Schrödinger упражнение, потому что действие по перебазированию некоторых 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 Ответ

1 голос
/ 18 февраля 2009

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

dumpbin / headers даст вам:

 7DC90000 image base (7DC90000 to 7DD5FFFF)

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

...