Динамически подключаемая библиотека¶
Динамически подключаемая библиотека (DLL, от англ. dynamic-link library) — это файл, содержащий исполняемый код и данные, который загружается в адресное пространство процесса во время выполнения программы, а не на этапе её сборки. Формат применяется преимущественно в операционных системах семейства Microsoft Windows и служит для повторного использования кода несколькими приложениями одновременно. В других системах аналогичную роль выполняют разделяемые объекты (SO в Linux, dylib в macOS).
¶Назначение и принцип работы
Основная идея DLL — вынести часто используемые функции в отдельный модуль, который подключается к программе динамически. Это даёт несколько эффектов: экономию дискового пространства и оперативной памяти (одна копия кода в памяти используется несколькими процессами), упрощение обновления (достаточно заменить один файл библиотеки, не пересобирая приложение) и модульность архитектуры.
Программа обращается к DLL двумя способами:
- Статическое связывание при загрузке — компоновщик прописывает в исполняемом файле ссылку на библиотеку, и она загружается автоматически при старте приложения.
- Динамическая загрузка — приложение во время работы вызывает функции операционной системы (например,
LoadLibraryиGetProcAddressв Windows) и получает адреса нужных функций по имени.
Внутри DLL обычно находится таблица экспорта — список функций и переменных, доступных внешним программам. Символы, которые библиотека импортирует из других модулей, перечисляются в таблице импорта.
¶История
Концепция разделяемых библиотек появилась вместе с многозадачными операционными системами. В ранних версиях Windows (до 3.0) использовались так называемые «библиотеки динамической компоновки», но полноценный механизм DLL сформировался в Windows 3.x и был развит в Windows NT. В Windows NT добавились механизмы управления версиями, таблицы экспорта в формате PE (Portable Executable) и защита через цифровые подписи.
В Unix-системах аналогичный механизм — разделяемые объекты (.so) — развивался параллельно, начиная с конца 1980-х годов. Формат ELF стал стандартом для Linux и большинства современных Unix-подобных систем.
¶Устройство файла
DLL в Windows имеет формат PE, тот же, что и исполняемые файлы .exe. Ключевые элементы:
- Заголовок PE — описывает тип файла, архитектуру, точку входа.
- Секции кода и данных — собственно машинный код и глобальные переменные.
- Таблица экспорта — имена и адреса функций, доступных извне.
- Таблица импорта — ссылки на функции, которые DLL берёт из других модулей.
- Ресурсы — иконки, строки, диалоги.
Точка входа DLL (DllMain) вызывается при загрузке и выгрузке библиотеки, а также при создании и завершении потоков. В ней обычно выполняется инициализация внутренних структур.
¶Применение
DLL широко используются в системном и прикладном программировании:
- Системные библиотеки Windows —
kernel32.dll,user32.dll,gdi32.dllобеспечивают базовые функции работы с памятью, окнами и графикой. - Прикладные приложения — текстовые редакторы, игры, браузеры выносят в DLL модули обработки форматов, плагины, драйверы устройств.
- Драйверы — значительная часть драйверов в Windows реализована как DLL.
- Расширения и плагины — механизм DLL позволяет подключать сторонние модули без пересборки основной программы.
¶Преимущества и недостатки
К преимуществам относят экономию памяти, возможность обновления отдельных модулей, повторное использование кода и модульность. К недостаткам — риск конфликта версий (так называемый «DLL hell», когда разные программы требуют несовместимых версий одной библиотеки), усложнение отладки и потенциальные уязвимости: подмена DLL злоумышленником может привести к выполнению произвольного кода.
¶Безопасность
Механизм DLL неоднократно становился источником уязвимостей. Атака «подмена DLL» (DLL hijacking) основана на том, что Windows ищет библиотеку в нескольких каталогах по определённому порядку, и злоумышленник может поместить вредоносный файл в один из них. Для противодействия применяются цифровые подписи, безопасный порядок поиска и изоляция процессов.
¶Аналоги в других системах
| Система | Расширение | Формат |
|---|---|---|
| Windows | .dll | PE |
| Linux | .so | ELF |
| macOS | .dylib | Mach-O |
| Android | .so | ELF |
Несмотря на различия форматов, принцип остаётся единым: код выносится в отдельный модуль, подключаемый во время выполнения.
Источники: документация Microsoft по формату PE и DLL, материалы по операционным системам Windows NT, справочники по формату ELF.