Динамический компоновщик - Dynamic linker

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

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

Реализации

Майкрософт Виндоус

Библиотека с динамической компоновкой, или DLL, является Microsoft реализация общая библиотека концепция в Майкрософт Виндоус и OS / 2 операционные системы. Эти библиотеки обычно имеют расширение файла DLL, OCX (для библиотек, содержащих ActiveX элементы управления), или ДРВ (для наследия системные драйверы ). Форматы файлов для DLL такие же, как для Windows EXE файлы - то есть Переносимый исполняемый файл (PE) для 32-битный и 64-битный Окна и Новый исполняемый файл (NE) для 16 бит Windows. Как и в случае с EXE, библиотеки DLL могут содержать код, данные, и Ресурсы, в любом сочетании.

Данные файлы с тем же формат файла как DLL, но с разными расширениями файлов и, возможно, содержащими только разделы ресурсов, могут называться ресурсными DLL. Примеры таких DLL включают значок библиотеки, иногда имеющие расширение ICL, и шрифт файлы, имеющие расширения FON и FOT.[1]

Unix-подобные системы с использованием ELF и системы на основе Дарвина

В большинстве Unix-подобный систем, большая часть машинного кода, составляющего динамический компоновщик, на самом деле является внешним исполняемым файлом, который операционная система ядро загружает и выполняет сначала в адресном пространстве процесса, созданном в результате вызова exec или же posix_spawn функции. Во время компоновки путь динамического компоновщика, который следует использовать, внедряется в исполняемый образ.

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

Системы, использующие ELF

В Unix-подобных системах, использующих ELF для исполняемых образов и динамических библиотек, таких как Солярис, 64-битные версии HP-UX, Linux, FreeBSD, NetBSD, OpenBSD, и DragonFly BSD, путь динамического компоновщика, который следует использовать, внедряется во время ссылки в .interp раздел исполняемого файла PT_INTERP сегмент. В этих системах динамически загружаемые разделяемые библиотеки можно идентифицировать по суффиксу имени файла .так (общий объект).

На динамический компоновщик можно повлиять, чтобы изменить его поведение либо во время выполнения программы, либо во время связывания программы, и примеры этого можно увидеть на страницах справочника компоновщика времени выполнения для различных Unix-подобных систем.[2][3][4][5][6] Типичная модификация этого поведения - использование LD_LIBRARY_PATH и LD_PRELOAD переменные среды, которые регулируют процесс связывания во время выполнения путем поиска разделяемых библиотек в альтернативных местах и ​​принудительной загрузки и связывания библиотек, которых в противном случае не было бы, соответственно. Пример - zlibc,[7] также известный как uncompress.so,[а] что облегчает прозрачную декомпрессию при использовании через LD_PRELOAD взломать; в результате можно читать предварительно сжатые (сжатые с помощью gzip) данные файлов в системах BSD и Linux, как если бы файлы не были сжатыми, что по существу позволяет пользователю добавить прозрачное сжатие к базовой файловой системе, хотя и с некоторыми оговорками. Механизм является гибким, позволяя тривиально адаптировать один и тот же код для выполнения дополнительной или альтернативной обработки данных во время чтения файла перед предоставлением указанных данных пользовательскому процессу, который их запросил.[8][9]

macOS и iOS

В Apple Дарвин операционная система, а в macOS и iOS операционных систем, построенных на его основе, путь динамического компоновщика, который должен использоваться, внедряется во время компоновки в один из Мачо загрузить команды в исполняемый образ. В этих системах динамически загружаемые разделяемые библиотеки можно идентифицировать либо по суффиксу имени файла .dylib или размещением внутри пучок для каркаса.

Динамический компоновщик не только связывает целевой исполняемый файл с разделяемыми библиотеками, но также размещает функции машинного кода в определенных адресных точках в памяти, о которых целевой исполняемый файл знает во время компоновки. Когда исполняемый файл желает взаимодействовать с динамическим компоновщиком, он просто выполняет машинно-зависимый вызов или инструкцию перехода к одной из этих хорошо известных адресных точек. Исполняемые файлы на платформах macOS и iOS часто взаимодействуют с динамическим компоновщиком во время выполнения процесса; известно даже, что исполняемый файл может взаимодействовать с динамическим компоновщиком, заставляя его загружать больше библиотек и разрешать большее количество символов через несколько часов после его первоначального запуска. Причина того, что программа macOS или iOS так часто взаимодействует с динамическим компоновщиком, связана как с Apple Какао и Какао Touch API и Цель-C, язык, на котором они реализованы (дополнительную информацию см. в их основных статьях).

Динамический компоновщик может быть принудительно изменен в части своего поведения; однако, в отличие от других Unix-подобных операционных систем, эти модификации являются подсказками, которые могут (а иногда и игнорируются) динамическим компоновщиком. Примеры этого можно увидеть в dyldсправочная страница.[10] Типичная модификация этого поведения - использование DYLD_FRAMEWORK_PATH и DYLD_PRINT_LIBRARIES переменные среды. Первая из ранее упомянутых переменных регулирует путь поиска исполняемых файлов для разделяемых библиотек, а вторая отображает имена библиотек по мере их загрузки и связывания.

Динамический компоновщик MacOS от Apple - это проект с открытым исходным кодом, выпущенный в рамках Дарвин и его можно найти в открытом исходном коде Apple dyld проект.[11]

Unix-подобные системы на основе XCOFF

В Unix-подобных операционных системах с использованием XCOFF, Такие как AIX, динамически загружаемые общие библиотеки используют суффикс имени файла .a.

На динамический компоновщик можно повлиять, чтобы изменить его поведение как во время выполнения программы, так и во время связывания программы. Типичной модификацией этого поведения является использование LIBPATH переменная окружения Эта переменная регулирует процесс связывания во время выполнения путем поиска разделяемых библиотек в альтернативных местах и ​​принудительной загрузки и связывания библиотек, которых в противном случае не было бы, соответственно.

OS / 360 и последователи

Динамическое связывание программ на языке Ассемблер в IBM OS / 360 и ее преемники обычно выполняется с помощью макроса LINK, содержащего Инструкция по вызову супервизора который активирует процедуры операционной системы, которые делают библиотечный модуль доступным для программы. Модули библиотеки могут находиться в «STEPLIB» или «JOBLIB», указанном на платах управления и доступном только для определенного выполнения программы, в библиотеке, включенной в LINKLIST в PARMLIB (указанном во время запуска системы), или в « область пакета ссылок », куда загружаются определенные повторно входящие модули во время запуска системы.

Мультики

в Мультики операционной системы все файлы, включая исполняемые, сегменты. Вызов подпрограммы, не являющейся частью текущего сегмента, заставит систему найти указанный сегмент в памяти или на диске и добавить его в адресное пространство запущенного процесса. Динамическое связывание - это нормальный метод работы, а статическое связывание (с использованием связующее) является исключением.

Эффективность

Динамическое связывание обычно медленнее (требует больше циклов ЦП), чем связывание во время компиляции,[12] как и в случае с большинством процессов, выполняемых во время выполнения. Однако динамическое связывание часто более эффективно с точки зрения пространства (на диске и в памяти во время выполнения). Когда библиотека связана статически, каждый запускаемый процесс связан со своей собственной копией вызываемых библиотечных функций. Следовательно, если библиотека вызывается много раз разными программами, одни и те же функции в этой библиотеке дублируются в нескольких местах системной памяти. Использование общих динамических библиотек означает, что вместо того, чтобы связывать каждый файл с его собственной копией библиотеки во время компиляции и потенциально тратить пространство памяти, только одна копия библиотеки всегда сохраняется в памяти за раз, освобождая пространство памяти для хранения. используется в другом месте.[13] Кроме того, при динамической компоновке библиотека загружается только в том случае, если она действительно используется.[14]

Смотрите также

Примечания

  1. ^ Не путать с zlib библиотека сжатия.

Рекомендации

  1. ^ Корпорация Майкрософт. «Создание ресурсной библиотеки DLL». Сетевая библиотека разработчика Microsoft.
  2. ^ ld.so.1 (1): Динамический компоновщик / загрузчик Solaris -Solaris 10 Справочник по командам пользователя Руководство
  3. ^ ld-linux.so (8) – Linux Программиста Руководство - Администрирование и привилегированные команды
  4. ^ rtld (1): FreeBSD динамический компоновщик / загрузчик -FreeBSD Общие команды Руководство
  5. ^ ld.elf_so (1): Динамический компоновщик / загрузчик NetBSD -NetBSD Общие команды Руководство
  6. ^ ld.so (1): OpenBSD динамический компоновщик / загрузчик -OpenBSD Общие команды Руководство
  7. ^ https://www.zlibc.linux.lu/
  8. ^ "uncompress.so". delorie.com. Получено 2014-07-04.
  9. ^ "zlibc.conf". delorie.com. Получено 2014-07-04.
  10. ^ дильд (1): Darwin / Mac OS X динамический компоновщик / загрузчик -Дарвин и macOS Общие команды Руководство
  11. ^ Apple Inc. «Открытый код - Релизы». apple.com. Получено 2014-07-04.
  12. ^ Сюсянь, Цзян (2009). «Принципы операционных систем: связывание и загрузка» (PDF). Университет штата Северная Каролина. Получено 2020-09-24.
  13. ^ Джонс, М. (28 августа 2008 г.). «Анатомия динамических библиотек Linux». IBM. Получено 2020-09-24.
  14. ^ Сивилотти, Пол (август 2012). «Динамическое связывание и загрузка» (PDF). Государственный университет Огайо. Получено 2020-09-24.

дальнейшее чтение

внешняя ссылка