Компоновщик это программа которая

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

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

Обзор

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

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

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

C#. Паттерн проектирования программ «Компоновщик (Composite)».

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

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

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

Java шаблон КомпоновщикComposite

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

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

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

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

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

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

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

Статическая компоновка

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

Читайте также:
Отзывы о программе erp

Перемещение

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

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

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

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

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

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

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

Редактирование связей (номенклатура 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 «.

См. Также

  • Портал компьютерного программирования
  • Портал бесплатного программного обеспечения с открытым исходным кодом
  • Библиотека дескрипторов двоичных файлов (libbfd)
  • Система компиляции и запуска
  • DLL hell
  • Прямая привязка
  • Динамическая привязка
  • Динамическое устранение мертвого кода
  • Динамическая отправка
  • Динамическая библиотека
  • Динамический компоновщик
  • Динамическая загрузка
  • Динамически подключаемая библиотека
  • Библиотека
  • Загрузчик
  • Украшение имени
  • Предварительное связывание (предварительное связывание)
  • Перемещение
  • Умное связывание
  • Статическая библиотека
  • gold (компоновщик)

Ссылки

Дополнительная литература

  • Fraser, Christopher W.; Хэнсон, Дэвид Р. (апрель 1982 г.). «Машинно-независимый линкер». Программное обеспечение: практика и опыт. John Wiley Sons Ltd. 12(4): 351–366. doi : 10.1002 / spe.4380120407. ISSN1097-024X.
  • Операционная система 360 — Редактор связей (E) — Руководство по логике программы (PDF) (3-е изд.). Международная корпорация бизнес-машин. 1969-07-23 [июнь 1967]. Номер программы 360S-ED-510. Файл № S360-31. Форма Y28-6610-2. Архивировано из оригинального (PDF) 01.10.2007. Проверено 7 марта 2020 г.
  • Джонс, Дуглас В. (август 1983 г.). «Язык ассемблера как объектный код». Программное обеспечение: практика и опыт. John Wiley Sons Ltd. 13(8): 715–725. doi : 10.1002 / spe.4380130806. ISSN1097-024X.
  • Левин, Джон Р. (2000) [октябрь 1999]. Линкеры и загрузчики. Серия Морган Кауфманн в программной инженерии и программировании (1-е изд.). Сан-Франциско, США: Морган Кауфманн. ISBN 1-55860-496-0. OCLC42413382. Архивировано из оригинала на 2012-12-05. Проверено 12 января 2020 г. Код: [1pting[2] Опечатки: [3]
  • Прессер, Леон ; Уайт, Джон Р. (сентябрь 1972 г.). «Компоновщики и загрузчики» (PDF). Вычислительные исследования ACM. Калифорнийский университет, Санта-Барбара, Калифорния, США. 4 (3): 149–167. doi : 10.1145 / 356603.356605. Архивировано (PDF) из оригинала 07.03.2020. Проверено 7 марта 2020 г. (19 страниц)
  • Рэмси, Норман (май 1996 г.). «Инструкции по перемещению машины путем каррирования» (PDF). Уведомления ACM SIGPLAN. С. 226–236. doi : 10.1145 / 249069.231429. Архивировано (PDF) из оригинала 18.05.2020.
Читайте также:
Программа которая заходит на сайт

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

Найдите linker в Wiktionary, бесплатном словаре.
  • Записи блога линкеров Яна Лэнса Тейлора
  • Линкеры и загрузчики, статья Сандипа Гровера в Linux Journal
  • Еще один список того, где можно получить полную коллекцию бесплатных инструментов для языка ассемблера Разработка
  • Руководство по компоновщику GNU
  • LLD — компоновщик LLVM
  • ld (1) : компоновщик GNU — Linux Команды пользователя Руководство

Источник: alphapedia.ru

Разница между компоновщиком и загрузчиком

Основы программирования #2 Компилятор и интерпретатор

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

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

Сравнительная таблица

Основа для сравненияКомпоновщикЗагрузчик
Базовый Он генерирует исполняемый модуль исходной программы. Он загружает исполняемый модуль в основную память.
Ввод В качестве входных данных он принимает объектный код, созданный ассемблером. Требуется исполняемый модуль, созданный компоновщиком.
Функция Он объединяет все объектные модули исходного кода для создания исполняемого модуля. Он выделяет адреса исполняемому модулю в основной памяти для выполнения.
Тип / подход Редактор ссылок, динамический компоновщик. Абсолютная загрузка, перемещаемая загрузка и динамическая загрузка во время выполнения.

Определение линкера

Ассемблер генерирует объектный код исходной программы и передает его компоновщику. Компоновщик берет этот объектный код и генерирует исполняемый код для программы и передайте загрузчику.

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

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

У нас есть два типа линкеров.

  • Редактор связей: Это компоновщик, который генерирует перемещаемый исполняемый модуль.
  • Динамический компоновщик: Он откладывает / откладывает связывание некоторых внешних модулей до тех пор, пока не будет сгенерирован загрузочный модуль / исполняемый модуль. Здесь связывание выполняется во время загрузки или выполнения.

Определение загрузчика

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

Есть три типа загрузки:

  • Абсолютная загрузка
  • Перемещаемая загрузка
  • Динамическая загрузка во время выполнения

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

Перемещаемая загрузка: В этом подходе компилятор или ассемблер выполняет не производить фактический адрес основной памяти. Он производит относительные адреса.

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

Вывод

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

Источник: ru1.surveillancepackages.com

12. Компоновщик. Назначение и функции компоновщика

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

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

Читайте также:
Критическая ошибка исполнение программы приостановлено soulstorm ua mod

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

Одновременно с объединением текстов программных секций объединя­ются секции данных, таблицы идентификаторов и внешних имен. Разрешаются межсекционные ссылки.

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

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

13. Загрузчики и отладчики. Функции загрузчика

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

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

Однако загрузчик не всегда является составной частью системы программирова­ния, поскольку выполняемые им функции очень зависят от архитектуры целе­вой вычислительной системы, в которой выполняется результирующая программа, созданная системой программирования. На первых этапах развития ОС загруз­чики существовали в виде отдельных модулей, которые выполняли трансляцию адресов и готовили программу к выполнению — создавали так называемый «об­раз задачи». Такая схема была характерна для многих ОС (например, для ОСРВ на ЭВМ типа СМ-1, ОС RSX/11 или RAFOS на ЭВМ типа СМ-4 и т. п. [20, 57]). Образ задачи можно было сохранить на внешнем носителе или же создавать его вновь всякий раз при подготовке программы к выполнению.

С развитием архитектуры вычислительных средств компьютера появилась воз­можность выполнять трансляцию адресов непосредственно в момент запуска про­граммы на выполнение. Для этого потребовалось в состав исполняемого файла включить соответствующую таблицу, содержащую перечень ссылок на адреса, которые необходимо подвергнуть трансляции. В момент запуска исполняемого файла ОС обрабатывала эту таблицу и преобразовывала относительные адреса в абсолютные. Такая схема, например, характерна для ОС типа MS-DOS, кото­рые широко распространены в среде персональных компьютеров. В этой схеме модуль загрузчика как таковой отсутствует (фактически он входит в состав ОС), а система программирования ответственна только за подготовку таблицы транс­ляции адресов — эту функцию выполняет компоновщик.

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

Еще одним модулем системы программирования, функции которого тесно связа­ны с выполнением программы, является отладчик.

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

  • последовательное пошаговое выполнение результирующей программы на ос­ нове шагов по машинным командам или по операторам входного языка;
  • выполнение результирующей программы до достижения ею одной из задан­ ных точек останова (адресов останова);
  • выполнение результирующей программы до наступления некоторых заданных условий, связанных с данными и адресами, обрабатываемыми этой програм­ мой;
  • просмотр содержимого областей памяти, занятых командами или данными результирующей программы.
  • появлением интегрированных сред разработки;
  • появление возможностей аппаратной поддержки средств отладки во многих вычислительных системах.

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru