Отладка приложений



         

Адреса загрузки DLL - часть 2


Удостоверьтесь, что вы исправляете адреса загрузки как для выпускных (финальных), так и для отладочных конфигураций.

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 три раза.


Содержание  Назад  Вперед