Линкер (вычисления)
В вычислительной технике компоновщик , или редактор ссылок — это компьютерная системная программа которая берет один или несколько объектных файлов (сгенерированных компилятором или ассемблером ) и объединяет их в один исполняемый файл, файл библиотеки или другой «объектный» файл.
Более простая версия, которая записывает выходные данные непосредственно в память, называется загрузчиком , хотя загрузка обычно считается отдельным процессом. [ 1 ] [ 2 ]
Обзор
[ редактировать ]Компьютерные программы обычно состоят из нескольких частей или модулей; эти части/модули не обязательно должны содержаться в одном объектном файле , и в таких случаях они ссылаются друг на друга, используя символы как адреса в другие модули, которые отображаются в адреса памяти при связывании для выполнения.
Хотя процесс связывания предназначен для окончательного объединения этих независимых частей, существует множество веских причин разрабатывать их отдельно на уровне исходного кода . Среди этих причин — простота организации нескольких более мелких частей в монолитное целое и возможность лучше определить назначение и обязанности каждой отдельной части, что важно для управления сложностью и повышения удобства сопровождения в долгосрочной перспективе в архитектуре программного обеспечения .
Обычно объектный файл может содержать три типа символов:
- определенные «внешние» символы, иногда называемые «общедоступными» или «входными» символами, которые позволяют вызывать его из других модулей,
- неопределенные «внешние» символы, которые ссылаются на другие модули, в которых эти символы определены, и
- локальные символы, используемые внутри объектного файла для облегчения перемещения .
Для большинства компиляторов каждый объектный файл является результатом компиляции одного входного файла исходного кода. Когда программа состоит из нескольких объектных файлов, компоновщик объединяет эти файлы в единую исполняемую программу, разрешая символы по мере ее выполнения.
Линкеры могут брать объекты из коллекции, называемой библиотекой или библиотекой времени выполнения . Большинство компоновщиков не включают все объектные файлы статической библиотеки в выходной исполняемый файл; они включают только те объектные файлы из библиотеки, на которые прямо или косвенно ссылаются другие объектные файлы или библиотеки. Но для общей библиотеки вся библиотека должна быть загружена во время выполнения, поскольку неизвестно, какие функции или методы будут вызываться во время выполнения. Таким образом, связывание библиотек может быть итеративным процессом, при этом некоторые упомянутые модули требуют связывания дополнительных модулей и так далее. Библиотеки существуют для различных целей, и одна или несколько системных библиотек обычно подключаются по умолчанию.
программы Компоновщик также заботится об упорядочении объектов в адресном пространстве . Это может включать перемещение кода, принимающего определенный базовый адрес, в другую базу. Поскольку компилятор редко знает, где будет находиться объект, он часто предполагает фиксированное базовое местоположение (например, нулевое ). Перемещение машинного кода может включать перенацеливание абсолютных переходов, загрузок и сохранений.
Вывод исполняемого файла компоновщика может потребовать еще одного прохода перемещения, когда он окончательно загружается в память (непосредственно перед выполнением). Этот проход обычно опускается на оборудовании, предлагающем виртуальную память : каждая программа помещается в свое собственное адресное пространство, поэтому конфликта не возникает, даже если все программы загружаются по одному и тому же базовому адресу. Этот проход также можно пропустить, если исполняемый файл является независимым от позиции исполняемым файлом.
В некоторых вариантах Unix , таких как SINTRAN III , процесс, выполняемый компоновщиком (сборка объектных файлов в программу), назывался загрузкой (как при загрузке исполняемого кода в файл). [ 3 ] Кроме того, в некоторых операционных системах одна и та же программа выполняет как задачу связывания, так и загрузку программы ( динамическое связывание ).
Динамическое связывание
[ редактировать ]Многие среды операционных систем допускают динамическое связывание, откладывая разрешение некоторых неопределенных символов до запуска программы. Это означает, что исполняемый код по-прежнему содержит неопределенные символы, а также список объектов или библиотек, которые предоставляют для них определения. Загрузка программы также загрузит эти объекты/библиотеки и выполнит окончательное связывание.
Этот подход дает два преимущества:
- Часто используемые библиотеки (например, стандартные системные библиотеки) необходимо хранить только в одном месте, а не дублировать в каждом исполняемом файле, что позволяет сэкономить ограниченную память и дисковое пространство.
- Если ошибка в библиотечной функции исправлена путем замены библиотеки или улучшена производительность , все программы, использующие ее динамически, получат выгоду от исправления после их перезапуска. Программы, включившие эту функцию путем статической компоновки, сначала необходимо будет перекомпоновать.
Есть и недостатки:
- Несовместимая обновленная библиотека, известная на платформе Windows как « ад DLL », приведет к поломке исполняемых файлов, поведение которых зависело от поведения предыдущей версии библиотеки, если новая версия не обладает обратной совместимостью .
- Программа вместе с используемыми ею библиотеками может быть сертифицирована (например, в отношении правильности, требований к документации или производительности) как пакет, но не в том случае, если компоненты могут быть заменены (это также является аргументом против автоматического обновления ОС в критических системах; в обоих случаях случаях ОС и библиотеки являются частью квалифицированной среды).
Автономные или виртуальные среды могут дополнительно позволить системным администраторам смягчить или найти компромисс между этими отдельными плюсами и минусами.
Статическая связь
[ редактировать ]Статическое связывание — это результат копирования компоновщиком всех библиотечных процедур, используемых в программе, в исполняемый образ. Это может потребовать больше дискового пространства и памяти, чем динамическое связывание, но оно более портативно, поскольку не требует наличия библиотеки в системе, где она работает. Статическое связывание также предотвращает «ад DLL», поскольку каждая программа включает в себя именно те версии библиотечных процедур, которые ей необходимы, без конфликта с другими программами. Программа, использующая всего несколько процедур из библиотеки, не требует установки всей библиотеки.
Переезд
[ редактировать ]Поскольку у компилятора нет информации о расположении объектов в конечном выводе, он не может воспользоваться более короткими или более эффективными инструкциями, которые предъявляют требования к адресу другого объекта. Например, инструкция перехода может ссылаться на абсолютный адрес или смещение от текущего местоположения, а смещение может быть выражено с различной длиной в зависимости от расстояния до цели. Сначала создав наиболее консервативную инструкцию (обычно самый большой относительный или абсолютный вариант, в зависимости от платформы) и добавив подсказки по расслаблению , можно заменить более короткие или более эффективные инструкции во время финальной ссылки. Что касается оптимизации прыжков, это также называется автоматическим изменением размера прыжка . [ 4 ] Этот шаг можно выполнить только после того, как все входные объекты прочитаны и им присвоены временные адреса; впоследствии проход релаксации линкера переназначает адреса, что, в свою очередь, может позволить произойти больше потенциальных релаксаций. Как правило, заменяемые последовательности короче, что позволяет этому процессу всегда сходиться к лучшему решению при фиксированном порядке объектов; если это не так, расслабления могут конфликтовать, и компоновщику необходимо взвесить преимущества любого варианта.
Хотя расслабление инструкций обычно происходит во время компоновки, расслабление внутри модуля может происходить уже во время процесса оптимизации во время компиляции . В некоторых случаях расслабление также может происходить во время загрузки как часть процесса перемещения или в сочетании с методами динамического устранения мертвого кода .
Редактор связей
[ редактировать ]IBM System/360 В средах мэйнфреймов , таких как OS/360 , включая z/OS для мэйнфреймов z/Architecture , этот тип программы известен как редактор связей . Как следует из названия, редактор связей имеет дополнительную возможность добавления, замены и/или удаления отдельных разделов программы. Операционные системы, такие как OS/360, имеют формат исполняемых загрузочных модулей, содержащий дополнительные данные о составных разделах программы, так что отдельный раздел программы может быть заменен, а другие части программы обновлены, чтобы можно было перемещать адреса и другие ссылки. быть исправлено редактором связей в рамках процесса.
Одним из преимуществ этого является то, что это позволяет поддерживать программу без необходимости сохранять все промежуточные объектные файлы или без необходимости перекомпиляции разделов программы, которые не изменились. Это также позволяет распространять обновления программы в виде небольших файлов (первоначально это были карты ), содержащих только заменяемый объектный модуль. В таких системах объектный код имеет форму и формат 80-байтовых изображений перфокарт, так что обновления могут быть внесены в систему с использованием этого носителя. В более поздних выпусках OS/360 и последующих системах загрузочные модули содержат дополнительные данные о версиях модулей компонентов для создания отслеживаемой записи обновлений. Он также позволяет добавлять, изменять или удалять структуру наложения из уже связанного загрузочного модуля.
Термин «редактор связей» не следует истолковывать как подразумевающий, что программа работает в интерактивном с пользователем режиме, как текстовый редактор. Он предназначен для пакетного выполнения, при этом команды редактирования подаются пользователем в последовательно организованных файлах, таких как перфокарты , DASD или магнитная лента .
Редактирование связей ( IBM номенклатура ) или консолидация или сбор ( номенклатура ICL ) относится к действию редактора связей или консолидатора по объединению различных частей в перемещаемый двоичный файл, тогда как загрузка и перемещение в абсолютный двоичный файл по целевому адресу обычно считается отдельным шаг. [ 2 ]
Скрипты управления компоновщиком
[ редактировать ]Вначале компоновщики давали пользователям очень ограниченный контроль над расположением генерируемых выходных объектных файлов. Поскольку целевые системы стали сложными с различными требованиями к памяти, такими как встроенные системы, возникла необходимость предоставить пользователям контроль над созданием выходных объектных файлов с их конкретными требованиями, такими как определение базовых адресов сегментов. Для этого использовались скрипты управления компоновщиками.
Общие реализации
[ редактировать ]В Unix и Unix-подобных системах компоновщик называется «ld». Название «ld» происходит от «LoaDer» и «Link eDitor». Термин «загрузчик» использовался для описания процесса загрузки внешних символов из других программ в процессе компоновки. [ 5 ]
Компоновщик GNU
[ редактировать ]Компоновщик GNU (или GNU ld) — это GNU проектом бесплатная программная реализация команды Unix ld, созданная . GNU ld запускает компоновщик, который создает исполняемый файл (или библиотеку) из объектных файлов, созданных во время компиляции программного проекта. Сценарий компоновщика можно передать в GNU ld, чтобы лучше контролировать процесс компоновки. [ 6 ] Компоновщик GNU является частью бинарных утилит GNU (binutils). В binutils предусмотрены две версии ld: традиционная GNU ld, основанная на bfd , и «упрощенная» версия только для ELF, называемая gold .
Синтаксис командной строки и сценариев компоновщика GNU ld является фактическим стандартом в большей части Unix-подобного мира. LLVM Компоновщик проекта , lld , разработан с учетом совместимости с прямым подключением, [ 7 ] и может использоваться непосредственно с компилятором GNU. Еще одна замена — Mould — это более распараллеленная и более быстрая альтернатива, которая также поддерживается инструментами GNU. [ 8 ]
См. также
[ редактировать ]- Библиотека дескрипторов двоичных файлов (libbfd)
- Сборка (вычисления)
- Скомпилируйте и запустите систему
- DLL ад
- Прямая привязка
- Динамическая привязка
- Динамическое устранение мертвого кода
- Динамическая отправка
- Динамическая библиотека
- Динамический компоновщик
- Динамическая загрузка
- Динамическая библиотека
- Внешняя переменная
- Библиотека
- Погрузчик
- Украшение имени
- Предварительная привязка (предварительная привязка)
- Переезд
- Умная связь
- Статическая библиотека
- Золото (линкер)
Ссылки
[ редактировать ]- ^ Редактор и загрузчик IBM OS Linkage (PDF) . Корпорация IBM . 1972. Архивировано (PDF) из оригинала 6 марта 2020 г. Проверено 7 марта 2020 г.
- ^ Перейти обратно: а б Бэррон, Дэвид Уильям (1978) [1971, 1969]. «5.7. Редакторы и консолидаторы связей». Написано в Саутгемптонском университете , Саутгемптон, Великобритания. Во Флоретине, Дж. Джон (ред.). Сборщики и грузчики . Компьютерные монографии (3-е изд.). Нью-Йорк, США: Elsevier North-Holland Inc., стр. 65–66. ISBN 0-444-19462-2 . LCCN 78-19961 . (xii+100 страниц)
- ^ Руководство пользователя BRF-LINKER . Август 1984 г. НД-60.196.01.
- ^ Саломон, Дэвид (февраль 1993 г.) [1992]. «8.2.3 Автоматическое изменение размера» (PDF) . Написано в Университете штата Калифорния, Нортридж, Калифорния, США. В Чиверсе, Ян Д. (ред.). Сборщики и грузчики . Серия Эллиса Хорвуда «Компьютеры и их приложения» (1-е изд.). Чичестер, Западный Суссекс, Великобритания: Ellis Horwood Limited / Simon & Schuster International Group . стр. 237–238. ISBN 0-13-052564-2 . Архивировано (PDF) из оригинала 23 марта 2020 г. Проверено 1 октября 2008 г. (xiv+294+4 страницы)
- ^ «1. л.д.». РУКОВОДСТВО ПРОГРАММИСТРА UNIX (6-е изд.). Май 1975 года.
- ^ «GNU Binutils: сценарии компоновщика» . 18 июля 2018 г. Архивировано из оригинала 06 марта 2020 г. Проверено 18 января 2019 г.
- ^ «LLD — LLVM Linker — документация lld 14» . lld.llvm.org .
- ^ «В GCC 12 добавлена поддержка использования Mold Linker» . www.phoronix.com .
Дальнейшее чтение
[ редактировать ]- Фрейзер, Кристофер В.; Хэнсон, Дэвид Р. (апрель 1982 г.). «Машинно-независимый линкер». Программное обеспечение: практика и опыт . 12 (4). John Wiley & Sons Ltd : 351–366. дои : 10.1002/спе.4380120407 . ISSN 1097-024X . S2CID 206508204 .
- Операционная система 360 - Редактор связей (E) - Руководство по логике программы (PDF) (3-е изд.). Международная корпорация бизнес-машин . 23 июля 1969 г. [июнь 1967 г.]. Номер программы 360S-ED-510. Файл № С360-31. Форма Y28-6610-2. Архивировано из оригинала (PDF) 1 октября 2007 г. Проверено 7 марта 2020 г.
- Джонс, Дуглас В. (август 1983 г.). «Язык ассемблера как объектный код». Программное обеспечение: практика и опыт . 13 (8). John Wiley & Sons Ltd : 715–725. дои : 10.1002/спе.4380130806 . ISSN 1097-024X . S2CID 42995338 .
- Левин, Джон Р. (2000) [октябрь 1999 г.]. Линкеры и загрузчики . Серия Моргана Кауфмана по разработке программного обеспечения и программированию (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0 . OCLC 42413382 . Архивировано из оригинала 5 декабря 2012 г. Проверено 12 января 2020 г. Код: [1] [2] Ошибки: [3]
- Прессер, Леон ; Уайт, Джон Р. (сентябрь 1972 г.). «Линкеры и загрузчики» (PDF) . Обзоры вычислительной техники ACM . 4 (3). Калифорнийский университет, Санта-Барбара, Калифорния, США: 149–167. дои : 10.1145/356603.356605 . S2CID 5694671 . Архивировано (PDF) из оригинала 07 марта 2020 г. Проверено 7 марта 2020 г. (19 страниц)
- Рэмси, Норман (май 1996 г.). «Перемещение машинных инструкций путем каррирования» (PDF) . Уведомления ACM SIGPLAN . 31 (5): 226–236. дои : 10.1145/249069.231429 . Архивировано (PDF) из оригинала 18 мая 2020 г.
Внешние ссылки
[ редактировать ]- Яна Лэнса Джастина Linkers Записи в блоге
- Линкеры и загрузчики , в Linux Journal статья Сандипа Гровера
- Еще один список того, где можно получить полную коллекцию бесплатных инструментов для разработки на ассемблере
- Руководство по компоновщику GNU
- LLD — компоновщик LLVM
- Linux пользователя Руководство – Пользовательские команды : Компоновщик GNU –