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

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

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

Реализации

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

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

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

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

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

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

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

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

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

macOS и iOS

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

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

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

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

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

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

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

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

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

Мультики

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

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

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

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

Примечания

использованная литература

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

внешние ссылки