Открыть сервис

Динамически подключаемая библиотека

Динамически подключаемая библиотека (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 широко используются в системном и прикладном программировании:

  • Системные библиотеки Windowskernel32.dll, user32.dll, gdi32.dll обеспечивают базовые функции работы с памятью, окнами и графикой.
  • Прикладные приложения — текстовые редакторы, игры, браузеры выносят в DLL модули обработки форматов, плагины, драйверы устройств.
  • Драйверы — значительная часть драйверов в Windows реализована как DLL.
  • Расширения и плагины — механизм DLL позволяет подключать сторонние модули без пересборки основной программы.

Преимущества и недостатки

К преимуществам относят экономию памяти, возможность обновления отдельных модулей, повторное использование кода и модульность. К недостаткам — риск конфликта версий (так называемый «DLL hell», когда разные программы требуют несовместимых версий одной библиотеки), усложнение отладки и потенциальные уязвимости: подмена DLL злоумышленником может привести к выполнению произвольного кода.

Безопасность

Механизм DLL неоднократно становился источником уязвимостей. Атака «подмена DLL» (DLL hijacking) основана на том, что Windows ищет библиотеку в нескольких каталогах по определённому порядку, и злоумышленник может поместить вредоносный файл в один из них. Для противодействия применяются цифровые подписи, безопасный порядок поиска и изоляция процессов.

Аналоги в других системах

СистемаРасширениеФормат
Windows.dllPE
Linux.soELF
macOS.dylibMach-O
Android.soELF

Несмотря на различия форматов, принцип остаётся единым: код выносится в отдельный модуль, подключаемый во время выполнения.

Источники: документация Microsoft по формату PE и DLL, материалы по операционным системам Windows NT, справочники по формату ELF.