Связывание
Связывание ( буквально «соединение») [1] в информатике — это процесс интеграции различных модулей , на которые ссылается программа (которые могут быть подпрограммами или библиотеками ), для создания единой исполняемой единицы. Компоновщик (или редактор ссылок ) — это программа, которая устанавливает связь между объектным кодом , то есть переводом исходного кода на машинный язык , и языковыми библиотеками, необходимыми для выполнения программы (API, интерфейс прикладного программирования ).
В мейнфреймах IBM , таких как OS/360, эта программа называется редактором компоновки . В вариантах Unix термин загрузчик также часто используется как синоним компоновщика. Из-за этой путаницы в терминологии между процессами времени компиляции и времени выполнения в этой записи будет использоваться компоновщик для первого и загрузка для второго.
Операция
Коды объектов — это части программы, содержащие как машинный код, так и информацию для компоновщика. Эта информация состоит в основном в форме определений символов, которые бывают двух типов:
- Определенные или экспортированные символы — это символы, которые представляют те функции или переменные, которые присутствуют в модуле (следовательно, в соответствующем объектном коде) и которые доступны для использования другими модулями.
- Символы , которые не определены или не импортированы , представляют функции, которые вызываются, или переменные, на которые ссылаются в настоящем объекте, и все же они не определены внутри, но определены в других модулях.
Работа компоновщика состоит в том, чтобы разрешать ссылки на неопределенные символы, находя, какой другой модуль их определяет; а затем заменить каждый заполнитель фактическим адресом символа.
Набор программных модулей, готовых для использования другими программами, называется « библиотекой ». Таким образом, библиотека представляет собой набор модулей (в виде объектных кодов), собранных в одном файле-контейнере. Линкеры могут использовать программные модули, содержащиеся в библиотеках. Некоторые компоновщики не включают всю библиотеку в выходную программу, а только те ее части, на которые необходимо ссылаться из другого объектного кода или других библиотек. Есть библиотеки разного назначения (примеры: взаимодействие с железом, математический расчет); как правило, наиболее распространенные библиотеки автоматически используются неявно, в то время как более специализированные должны быть явно указаны программистом .
Компоновщик также заботится о распространении программного обеспечения (объектного кода) в адресном пространстве программы. Это может потребовать перемещения кода с одного базового адреса на другой; это важная операция, поскольку перемещение сегмента кода с одного адреса на другой требует пересчета и изменения всех адресов, указывающих на этот код. Поскольку компилятор обычно не знает, где (в каком адресе памяти) будет находиться код, относящийся к конкретному модулю, компилятор предполагает фиксированный адрес (например, нулевой), который затем должен быть изменен, когда все модули объединены в уникальный адрес. исполняемый код. Перемещение сегмента кода с одного адреса на другой называется «перемещением» и может потребовать пересчета адресов, используемых в инструкциях абсолютного перехода или в инструкциях для загрузки или сохранения данных в памяти.
Исполняемая программа, созданная компоновщиком, может потребовать дальнейшего перемещения, когда программа загружается в память (непосредственно перед ее запуском). Этот шаг необязателен на компьютерах с системой виртуальной памяти ; на этих компьютерах каждая программа имеет собственное частное адресное пространство. В системах с виртуальной памятью все программы используют один и тот же базовый адрес без конфликтов между разными программами.
Динамическое связывание
Современные операционные системы предусматривают динамическое связывание , то есть разрешение неопределённых символов откладывается до момента выполнения программы . Это означает, что исполняемый файл содержит неопределенные символы и список объектов или библиотек, которые могут обеспечить его определение. Запуск программы на выполнение загружает эти объекты/библиотеки и устанавливает конечную ссылку.
Этот режим выполнения имеет два преимущества:
- Очень используемые библиотеки (типа стандартных системных) можно хранить в одном месте, а не дублировать при каждом запросе;
- Если библиотека функций обновляется и заменяется, все программы, которые ее используют, получают динамическую выгоду от обновления, как только они перезапускаются. И наоборот, программы, включающие такие функции статической ссылки, должны пройти новый этап редактирования/загрузчика компоновки.
Примечания
- ↑ Хотя некоторые тексты и авторы на итальянском языке решили перевести этот термин, последний используется очень редко.
Библиография
- Дэвид Уильям Бэррон, Сборщики и загрузчики . 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]
Связанные элементы
Внешние ссылки
- Главы рукописи книги «Linkers and Loaders» Джона Р. Левина , на iecc.com .
- Линкеры и загрузчики, Сандип Гровер , linuxjournal.com . Проверено 2 мая 2019 г. (архивировано из оригинала 6 мая 2019 г.) .
- Сравнение бесплатных линкеров на my.execpc.com . Проверено 15 марта 2007 г. (архивировано из оригинала 26 февраля 2007 г.) .
- Список других полезных инструментов, включая компоновщики , на сайте users.easystreet.com . Проверено 15 марта 2007 г. (архивировано из оригинала 12 марта 2007 г.) .
- Еще один список мест, где можно получить полную коллекцию бесплатных инструментов для разработки на языке ассемблера , на dpgraph.com . Проверено 15 марта 2007 г. (архивировано из оригинала 8 августа 2006 г.) .
- Руководство по компоновщику и библиотекам. Sun Microsystems Inc. ( PDF ), 192.18.109.11 . Проверено 15 марта 2007 г. (архивировано из оригинала 29 сентября 2007 г.) .
- GoLink: бесплатный компоновщик для программирования под Windows , на сайте godevtool.com .