Из Википедии, бесплатной энциклопедии
  (Перенаправлено из динамической библиотеки )
Перейти к навигации Перейти к поиску

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

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

Реализации [ править ]

Microsoft Windows [ править ]

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

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

Unix-подобные системы, использующие ELF, и системы на основе Дарвина [ править ]

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

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

Системы, использующие ELF [ править ]

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

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

macOS и iOS [ править ]

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

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

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

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

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

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

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

OS / 360 и последующие [ править ]

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

Мультики [ править ]

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

Эффективность [ править ]

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

См. Также [ править ]

  • Прямая привязка
  • DLL ад
  • Динамическая загрузка
  • Поздняя привязка
  • предварительная ссылка
  • Динамическое устранение мертвого кода

Заметки [ править ]

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

Ссылки [ править ]

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

Дальнейшее чтение [ править ]

  • Левин, Джон Р. (2000) [октябрь 1999]. Линкеры и загрузчики . Серия Морган Кауфманн в программной инженерии и программировании (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0. OCLC  42413382 . ISBN 978-1-55860-496-4 . Архивировано 05 декабря 2012 года . Проверено 12 января 2020 . Код: [1] [2] Ошибки: [3]

Внешние ссылки [ править ]

  • Динамическое связывание и загрузка , IECC.com
  • Динамическое связывание в Linux и Windows, часть первая , Symantec.com
  • Анатомия динамических библиотек Linux , IBM.com