stringtranslate.com

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

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

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

Более простая версия, которая записывает выходные данные непосредственно в память , называется загрузчиком , хотя загрузка обычно считается отдельным процессом. [1] [2]

Обзор

Компьютерные программы обычно состоят из нескольких частей или модулей; эти части/модули не обязательно должны содержаться в одном объектном файле , и в таких случаях они ссылаются друг на друга посредством символов как адреса в другие модули, которые отображаются в адреса памяти при связывании для выполнения.

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

Обычно объектный файл может содержать три типа символов:

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

Линкеры могут брать объекты из коллекции, называемой библиотекой или библиотекой времени выполнения . Большинство компоновщиков не включают все объектные файлы статической библиотеки в выходной исполняемый файл; они включают только те объектные файлы из библиотеки, на которые прямо или косвенно ссылаются другие объектные файлы или библиотеки. Но для общей библиотеки вся библиотека должна быть загружена во время выполнения, поскольку неизвестно, какие функции или методы будут вызываться во время выполнения. Таким образом, связывание библиотек может быть итеративным процессом, при этом некоторые упомянутые модули требуют связывания дополнительных модулей и так далее. Библиотеки существуют для различных целей, и одна или несколько системных библиотек обычно подключаются по умолчанию.

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

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

В некоторых вариантах Unix , таких как SINTRAN III , процесс, выполняемый компоновщиком (сборка объектных файлов в программу), назывался загрузкой (как при загрузке исполняемого кода в файл). [3] Кроме того, в некоторых операционных системах одна и та же программа выполняет как связывание, так и загрузку программы ( динамическое связывание ).

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

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

Этот подход дает два преимущества:

Есть и недостатки:

Автономные или виртуальные среды могут дополнительно позволить системным администраторам смягчить или найти компромисс между этими отдельными плюсами и минусами.

Статическая связь

Статическое связывание — это результат копирования компоновщиком всех библиотечных процедур, используемых в программе, в исполняемый образ. Для этого может потребоваться больше дискового пространства и памяти, чем для динамического связывания, но он более портативен, поскольку не требует наличия библиотеки в системе, где она работает. Статическое связывание также предотвращает «ад 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) — это бесплатная программная реализация команды Unix ld, созданная проектом GNU . 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. ^ аб Бэррон, Дэвид Уильям (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 — документация lld 14» . lld.llvm.org .
  8. ^ «GCC 12 добавляет поддержку использования Mold Linker» . www.phoronix.com .

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

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