LDR: Dll xxx base 10000000 relocated due to collision with yyy
(LDR: Dll xxx база 10000000 перемещена из-за конфликта с yyy)
xxx и yyy в этом утверждении — имена DLL-библиотек, которые находятся в конфликте друг с другом.
В дополнение к трудностям в поиске аварийного останова, когда операционная система должна перемещать DLL, ваше приложение еще и замедляет свое выполнение. При перемещении операционная система должна прочитать всю информацию перемещения для DLL, найти каждое место в коде, которое имеет доступ к адресу в DLL, и изменить этот адрес, потому что DLL больше не находится на своем, предписанном ему, месте в памяти. Если в приложении имеется хотя бы пара конфликтов загрузочных адресов, то ( продолжительность его запуска иногда увеличивается более чем вдвое!
Существует два способа перебазирования DLL-библиотек в приложении. Первый метод использует утилиту REBASE.EXE, которая поставляется с набором разработчика Platform SDK. Утилита REBASE.EXE имеет много различных возможностей (опций), но лучший выбор состоит в ее вызове через командную строку с ключом /b, со стартовым базовым адресом и указанием в командной строке имен соответствующих DLL-файлов.
Данные, представленные в табл. 2.1, взяты из документации Platform SDK и могут быть применены для перебазирования пользовательских DLL. Как видите, рекомендованный формат достаточно прост. Динамические библиотеки операционной системы загружаются в адреса от 0x70000000 до 0x78000000, поэтому следование рекомендациям табл 2.1 предохранит вас от конфликта с операционной системой.
Таблица 2.1. Схема перебазирования DLL
Первая буква имени DLL-файла |
Стартовый адрес |
А-С |
0x60000000 |
D-F |
0x61000000 |
G-I |
0x62000000 |
J-L |
0x63000000 |
М-О |
0x64000000 |
P-R |
0x65000000 |
S-U |
0x66000000 |
V-X |
0x67000000 |
Y-Z |
0x68000000 |
Если в приложении имеются четыре DLL-файла: APPLE.DLL, DUMPLING.DLL, GINGER.DLL и GOOSEBERRIES.DLL, то, чтобы перебазировать все эти DLL-файлы, нужно запустить REBASE.EXE три раза.