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

редактировать

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

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

Содержание

  • 1 Реализации
    • 1.1 Microsoft Windows
    • 1.2 Unix-подобные системы с использованием ELF и системы на основе Дарвина
      • 1.2.1 Системы, использующие ELF
      • 1.2.2 macOS и iOS
    • 1.3 Unix-подобные системы на основе XCOFF
    • 1.4 OS / 360 и последующие
    • 1.5 Multics
  • 2 Эффективность
  • 3 См. Также
  • 4 Примечания
  • 5 Ссылки
  • 6 Дополнительная литература
  • 7 Внешние ссылки

Реализации

Microsoft Windows

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

Файлы данных с тем же форматом файла, что и DLL, но с разными расширениями файлов и, возможно, содержащими только разделы ресурсов, могут называться ресурсными DLL. Примеры таких DLL включают библиотеки icon, иногда имеющие расширение ICL, и файлы font, имеющие расширения 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и LD_PRELOADпеременных среды, которые регулируют процесс связывания времени выполнения путем поиска общих библиотек в альтернативных местах и принудительная загрузка и компоновка библиотек, которых в противном случае не было бы соответственно. Примером является zlibc, также известный как uncompress.so, который обеспечивает прозрачную распаковку при использовании с помощью хака LD_PRELOAD ; в результате можно читать предварительно сжатые (сжатые с помощью gzip) данные файла в системах BSD и Linux, как если бы файлы не были сжатыми, что по существу позволяет пользователю добавить прозрачное сжатие в базовую файловую систему, хотя и с некоторыми оговорками. Механизм является гибким, позволяя тривиально адаптировать один и тот же код для выполнения дополнительной или альтернативной обработки данных во время чтения файла до предоставления указанных данных пользовательскому процессу, который их запросил.

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 и последующие

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

Multics

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

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

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

См. Также

  • значок Портал компьютерного программирования

Примечания

Ссылки

Дополнительная литература

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

Последняя правка сделана 2021-05-18 07:27:21
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте