Компоновщик (вычисление)

редактировать

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

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

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

Содержание
  • 1 Обзор
  • 2 Динамическое связывание
  • 3 Статическое связывание
  • 4 Перемещение
  • 5 Редактор связывания
  • 6 Линейщик GNU
  • 7 См. Также
  • 8 Ссылки
  • 9 Дополнительная литература
  • 10 Внешние ссылки
Обзор

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

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

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

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

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

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

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

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

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

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

  • Часто используемые библиотеки (например, стандартные системные библиотеки) необходимо хранить только в одном месте, а не дублировать в каждом отдельном исполняемом файле, что позволяет экономить ограниченное количество memory и disk space.
  • Если ошибка в библиотечной функции исправлена ​​путем замены библиотеки, все программы, использующие ее динамически, получат выгоду от исправления после их перезапуска. Программы, которые включали эту функцию путем статического связывания, должны быть сначала повторно связаны.

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

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

Статическая компоновка - это результат того, что компоновщик копирует все библиотечные подпрограммы, используемые в программе, в исполняемый образ. Для этого может потребоваться больше дискового пространства и памяти, чем для динамической компоновки, но это более переносимо, поскольку не требует наличия библиотеки в системе, в которой она выполняется. Статическая компоновка также предотвращает «ад DLL», поскольку каждая программа включает в себя именно те версии библиотечных подпрограмм, которые ей требуются, без конфликтов с другими программами. Программа, использующая всего несколько подпрограмм из библиотеки, не требует установки всей библиотеки.

Перемещение

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

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

Редактор связей

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

Одним из преимуществ этого является то, что он позволяет поддерживать программу без необходимости хранить все промежуточные объектные файлы или без необходимости повторно компилировать разделы программы, которые не изменились. Он также позволяет распространять обновления программы в виде небольших файлов (первоначально карточных колод ), содержащих только заменяемый объектный модуль. В таких системах объектный код имеет форму и формат 80-байтовых изображений перфокарт, так что обновления могут быть внесены в систему, использующую этот носитель. В более поздних выпусках OS / 360 и в последующих системах загрузочные модули содержат дополнительные данные о версиях модулей компонентов для создания отслеживаемой записи обновлений. Он также позволяет добавлять, изменять или удалять структуру overlay из уже связанного загрузочного модуля.

Термин «редактор связей» не следует истолковывать как подразумевающий, что программа работает в интерактивном режиме пользователя, как текстовый редактор. Он предназначен для выполнения в пакетном режиме, при этом команды редактирования предоставляются пользователем в последовательно организованных файлах, таких как перфокарты, DASD или магнитная лента <6.>, и ленты часто использовались при первоначальной установке ОС.

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

Компоновщик GNU

Компоновщик GNU (или GNU ld) - это Проект GNU реализация команды Unix ld. GNU ld запускает компоновщик, который создает исполняемый файл (или библиотеку) из объектных файлов, созданных во время компиляции программного проекта. Сценарий компоновщика может быть передан в GNU ld для большего контроля над процессом компоновки. Компоновщик GNU является частью двоичных утилит GNU (binutils). В binutils представлены две версии ld: традиционный GNU ld на основе bfd и версия только для ELF с именем gold.

. Возможное происхождение имени «ld»: «LoaD "и" Link eDitor ".

Компоновщик GNU - это бесплатное программное обеспечение, распространяемое в соответствии с условиями Стандартной общественной лицензии GNU.

См. Также
  • значок Портал компьютерного программирования
  • Портал бесплатного программного обеспечения с открытым исходным кодом
Ссылки
Дополнительная литература
Внешние ссылки
Найдите linker в Wiktionary, бесплатном словаре.
Последняя правка сделана 2021-05-27 10:42:08
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте