close

Связывание

Перейти к навигации Перейти к поиску

Связывание ( буквально «соединение») [1] в информатике — это процесс интеграции различных модулей , на которые ссылается программа (которые могут быть подпрограммами или библиотеками ), для создания единой исполняемой единицы. Компоновщик (или редактор ссылок ) — это программа, которая устанавливает связь между объектным кодом , то есть переводом исходного кода на машинный язык , и языковыми библиотеками, необходимыми для выполнения программы (API, интерфейс прикладного программирования ).

В мейнфреймах IBM , таких как OS/360, эта программа называется редактором компоновки . В вариантах Unix термин загрузчик также часто используется как синоним компоновщика. Из-за этой путаницы в терминологии между процессами времени компиляции и времени выполнения в этой записи будет использоваться компоновщик для первого и загрузка для второго.

Операция

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

  • Определенные или экспортированные символы — это символы, которые представляют те функции или переменные, которые присутствуют в модуле (следовательно, в соответствующем объектном коде) и которые доступны для использования другими модулями.
  • Символы , которые не определены или не импортированы , представляют функции, которые вызываются, или переменные, на которые ссылаются в настоящем объекте, и все же они не определены внутри, но определены в других модулях.

Работа компоновщика состоит в том, чтобы разрешать ссылки на неопределенные символы, находя, какой другой модуль их определяет; а затем заменить каждый заполнитель фактическим адресом символа.

Набор программных модулей, готовых для использования другими программами, называется « библиотекой ». Таким образом, библиотека представляет собой набор модулей (в виде объектных кодов), собранных в одном файле-контейнере. Линкеры могут использовать программные модули, содержащиеся в библиотеках. Некоторые компоновщики не включают всю библиотеку в выходную программу, а только те ее части, на которые необходимо ссылаться из другого объектного кода или других библиотек. Есть библиотеки разного назначения (примеры: взаимодействие с железом, математический расчет); как правило, наиболее распространенные библиотеки автоматически используются неявно, в то время как более специализированные должны быть явно указаны программистом .

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

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

Динамическое связывание

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

  • Очень используемые библиотеки (типа стандартных системных) можно хранить в одном месте, а не дублировать при каждом запросе;
  • Если библиотека функций обновляется и заменяется, все программы, которые ее используют, получают динамическую выгоду от обновления, как только они перезапускаются. И наоборот, программы, включающие такие функции статической ссылки, должны пройти новый этап редактирования/загрузчика компоновки.

Примечания

  1. Хотя некоторые тексты и авторы на итальянском языке решили перевести этот термин, последний используется очень редко.

Библиография

  • Дэвид Уильям Бэррон, Сборщики и загрузчики . 1972, Эльзевир.
  • CW Fraser и DR Hanson, Machine Independent Linker . Software-Practice and Experience 12, 4 (апрель 1982 г.).
  • Корпорация IBM, Операционная система 360, Редактор компоновки, Руководство по логике программы , 1967 г. [1]
  • Д. У. Джонс, Язык ассемблера как объектный код . Software-Practice and Experience 13, 8 (август 1983 г.)
  • Джон Р. Левин : Линкеры и загрузчики , Морган-Кауфман, ISBN 1-55860-496-0
  • Леон Прессер, Джон Р. Уайт: Линкеры и загрузчики . ACM Computing Surveys, том 4, номер 3, сентябрь 1972 г., стр. 149–167 [2]
  • Норман Рэмси, Перемещение машинных инструкций с помощью Currying . (1996) [3]
  • Дэвид Саломон, Сборщики и загрузчики . 1993 [4]

Связанные элементы

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