Если я хочу перебазировать свои DLL, как мне это сделать?
Это продолжение этого вопроса.
Я нахожусь в процессе тестирования, предоставит ли мне перебазирование.NET DLL и NGENning для них с большим количеством общего кода в памяти на терминальных серверах.
Однако у моего плана, похоже, есть недостаток, и я не могу найти рабочий метод для определения рабочего набора адресов.
Я думал, что могу сделать следующее:
- Просто построить и NGEN все
- Запустите программу, убедившись, что все DLL были загружены
- Используйте LISTDLLS / R PROGRAMNAME, чтобы получить список текущих используемых адресов для работающего экземпляра
- Используйте адреса тех DLL, которые были переназначены в качестве нового базового адреса для этих DLL
- 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)
Если вы планируете в соответствии с предпочтительными адресами загрузки, у вас не должно быть никаких проблем.