В Windows Server 2003 мое приложение начало долго загружаться при новой установке. Подозревая, что библиотеки DLL не загружаются по своему предпочтительному адресу, и это занимает некоторое время (приложение имеет более 100 библиотек DLL, включая сторонние), я запустил утилиту sysinternals listDLLs, попросив ее отметить каждую перемещенную dll. Как ни странно, для большинства DLL в списке я получаю что-то вроде этого:
Base Size Path
### Relocated from base of 0x44e90000:
0x44e90000 0x39000 validation.dll
То есть: они помечены как перемещенные (и время загрузки определенно подтверждает эту теорию), но их адрес загрузки остается предпочтительным адресом.
Некоторые сторонние библиотеки DLL, кажется, невосприимчивы к этому, но в целом это происходит примерно с 90% библиотек DLL, загружаемых приложением.
В Windows 7 кажется, что единственные помеченные библиотеки DLL — это те, которые действительно перемещаются, и время загрузки (как и ожидалось) значительно быстрее.
Чем это вызвано? Как я могу это остановить?
Отредактировано: поскольку это звучит (теоретически) как эффекты ASLR, я проверил, и хотя библиотеки DLL ОС действительно поддерживают ASLR, наши - нет. И даже они перемещены на место и, следовательно, не занимают адрес какой-либо из других DLL.