Jump to content

Линкер (вычисления)

(Перенаправлено с Jump-Size )

Иллюстрация процесса связывания. Объектные файлы и статические библиотеки собираются в новую библиотеку или исполняемый файл.

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

Более простая версия, которая записывает выходные данные непосредственно в память, называется загрузчиком , хотя загрузка обычно считается отдельным процессом. [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]

См. также

[ редактировать ]
  1. ^ Редактор и загрузчик IBM OS Linkage (PDF) . Корпорация IBM . 1972. Архивировано (PDF) из оригинала 6 марта 2020 г. Проверено 7 марта 2020 г.
  2. ^ Jump up to: а б Бэррон, Дэвид Уильям (1978) [1971, 1969]. «5.7. Редакторы и консолидаторы связей». Написано в Саутгемптонском университете , Саутгемптон, Великобритания. Во Флоретине, Дж. Джон (ред.). Сборщики и грузчики . Компьютерные монографии (3-е изд.). Нью-Йорк, США: Elsevier North-Holland Inc., стр. 65–66. ISBN  0-444-19462-2 . LCCN   78-19961 . (xii+100 страниц)
  3. ^ Руководство пользователя BRF-LINKER . Август 1984 г. НД-60.196.01.
  4. ^ Саломон, Дэвид (февраль 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 страницы)
  5. ^ «1. л.д.». РУКОВОДСТВО ПРОГРАММИСТРА UNIX (6-е изд.). Май 1975 года.
  6. ^ «GNU Binutils: сценарии компоновщика» . 18 июля 2018 г. Архивировано из оригинала 06 марта 2020 г. Проверено 18 января 2019 г.
  7. ^ «LLD — LLVM Linker — документация lld 14» . lld.llvm.org .
  8. ^ «В GCC 12 добавлена ​​поддержка использования Mold Linker» . www.phoronix.com .

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c01c68c001ed04f5d8b20e1bdd29aa98__1714527360
URL1:https://arc.ask3.ru/arc/aa/c0/98/c01c68c001ed04f5d8b20e1bdd29aa98.html
Заголовок, (Title) документа по адресу, URL1:
Linker (computing) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)