Как именно программа загружает DLL во время выполнения? (Также немного интересует формат файла PE, так как он связан) - PullRequest
0 голосов
/ 06 февраля 2020

Я немного растерялся. Насколько я понимаю (хотя я могу ошибаться), для того, чтобы программа получила доступ к DLL и ее функциям, ей необходимо загрузить DLL в саму программу. Означает ли это, что он буквально копирует весь DLL-контент и сохраняет его где-то в своей памяти?

Я немного прочитал о формате PE-файла, и хотя для меня это все еще немного неясно, я понимаю, что это как-то связано с тем, как программа обрабатывает библиотеки DLL. Загружается ли DLL в один из разделов PE в целом, или формат PE каким-то образом сохраняет указатели на функции DLL, загруженной в другом месте в памяти? Или это делает что-то совершенно другое, что я не понимаю?

Дополнительный вопрос, если вы, ребята, не возражаете: формат файла PE создает всю программу и весь код, который выполняет программа хранится где-то в разделах, или формат файла PE просто занимает часть памяти программы, в то время как разделы и заголовки содержат информацию, помогающую запустить программу?

Я, вероятно, ужасно неправильно понимаю многие вещи Здесь я нахожусь в процессе обучения, и я делаю все это для удовольствия. Я пытался провести собственное исследование, но я не всегда прекрасно понимаю.

1 Ответ

1 голос
/ 06 февраля 2020

Для вас все равно, ваш процесс имеет закрытую копию DLL. На практике, однако, ОС загружает DLL в физическую память один раз , и DLL - это память, отображаемая в каждом процессе, который в этом нуждается. Операционная система достаточно умна, чтобы делать заметки о том, в какие части DLL отображена память, и выделять для них память c, определяемую процессом. (технические термины здесь "ошибки страницы" и "копирование при записи")

Что касается другого вашего вопроса: файл на диске интерпретируется как PE-файл, чтобы выяснить несколько вещей, таких как его предпочтительный адрес загрузки (= адрес, где DLL будет находиться в отображаемой памяти), импорт (другие DLL) и точка входа. (эта функция обычно называется DllMain, которая вызывается, когда DLL загружается / выгружается и когда создаются / уничтожаются новые потоки)

Разделы, определенные в DLL, определяют, какие части файла являются кодом и которые являются ресурсами. Все загружаются и отображаются в память, но отображение памяти для частей кода делается исполняемым.

Существует гораздо больше объяснений, поэтому взгляните на статью Википедии о загрузке Dynami c , документация LoadLibrary , документация Windows для DLL и некоторые статьи о файле PE формат

...