Физика атомного реактора Сопротивление материалов Математика решение задач Информатика Атомная энергетика безопасность Электротехника и электроника
Знакомство с ассемблером Формат оператора Директивы Макроопределение Макровызовы Макросы с параметрами Процесс ассемблирования Компиляция Задачи компоновщика Динамическая компоновка

Динамическая компоновка в Windows

Все версии Windows, в том числе Windows NT, поддерживают динамическую компоновку. При динамической компоновке используется специальный файловый формат, который называется DLL (Dynamic Link Library — библиотека динамической компоновки). Библиотеки динамической компоновки могут содержать процедуры, данные или то и другое вместе. Обычно они применяются для того, чтобы два и более процессов могли разделять процедуры и данные библиотеки. Большинство DDL-файлов имеют расширение .dll, но встречаются и другие расширения, например .drv (для библиотек драйверов — driver libraries) и .fon (для библиотек шрифтов — font libraries).

Самая распространенная форма DLL — библиотека, состоящая из набора процедур, которые могут загружаться в память и к которым имеют доступ несколько процессов одновременно. На рисунке 7.7 показаны два процесса, которые совместно используют DLL-файл, содержащий 4 процедуры, Л, В, С и D. Программа 1 использует процедуру А; программа 2 — процедуру С, хотя они вполне могли бы использовать одну и ту же процедуру.

DLL-файл строится компоновщиком из группы входных файлов. Построение DDL напоминает создание исполняемого двоичного кода, только при создании DLL компоновщику передается специальный флаг, сообщающий о том, что требуется именно библиотека DLL. DLL-файлы обычно собираются из набора библиотечных процедур, которые могут понадобиться нескольким процессам. Типичными примерами DLL-файлов являются процедуры сопряжения с библиотекой системных вызовов Windows и большими графическими библиотеками. Применяя DDL-файлы, мы экономим пространство в памяти и на диске. Если бы та или иная библиотека была связана статически с каждой использующей ее программой, эту библиотеку пришлось бы включать во все исполняемые двоичные программы в памяти и на диске, что не экономно. А при наличии DLL-файла на диске и в памяти будет находиться всего одна библиотека.

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

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


Экспертные системы и экспертный анализ Архитектура компьютера Уровень ассемблера