Рекомендуем, 2024

Выбор редакции

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

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

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

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

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

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

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

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

Редактор связей : это компоновщик, который генерирует перемещаемый исполняемый модуль.

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

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

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

Существует три вида загрузки:

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

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

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

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

Ключевые различия между компоновщиком и загрузчиком

  1. Основное различие между компоновщиком и загрузчиком состоит в том, что компоновщик генерирует исполняемый файл программы, тогда как загрузчик загружает исполняемый файл, полученный из компоновщика, в основную память для выполнения .
  2. Компоновщик принимает объектный модуль программы, сгенерированной ассемблером. Однако загрузчик принимает исполняемый модуль, сгенерированный компоновщиком.
  3. Компоновщик объединяет все объектные модули программы для генерации исполняемых модулей, а также связывает библиотечную функцию в объектном модуле со встроенными библиотеками языка программирования высокого уровня. С другой стороны, загрузчик выделяет место для исполняемого модуля в основной памяти.
  4. Компоновщик может быть классифицирован как редактор связей и динамический компоновщик, тогда как загрузчик может быть классифицирован как абсолютный загрузчик, перемещаемый загрузчик и динамический загрузчик времени выполнения .

Заключение:

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

Top