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

Вибір Редакції

Різниця між лінкером і навантажувачем

Linker і Loader - утиліти, які відіграють важливу роль у виконанні програми. Вихідний код програми проходить через компілятор, асемблер, лінкер, завантажувач у відповідному порядку, перед виконанням. З одного боку, де лінкер приймає об'єктні коди, згенеровані асемблером і об'єднують їх для створення виконуваного модуля. З іншого боку, завантажувач завантажує цей виконуваний модуль в основну пам'ять для виконання. Давайте обговоримо різницю між Linker і Loader за допомогою діаграми порівняння.

Діаграма порівняння

Основа для порівнянняLinkerНавантажувач
ОсновнийВін генерує виконуваний модуль вихідної програми.Він завантажує виконуваний модуль в основну пам'ять.
Вхідні даніВін приймає як вхідний код об'єктний код, згенерований асемблером.Він приймає виконуваний модуль, згенерований лінкером.
ФункціяВін поєднує в собі всі об'єктні модулі вихідного коду для створення виконуваного модуля.Він виділяє адреси виконуваному модулю в основній пам'яті для виконання.
Тип / підхідРедактор зв'язків, динамічний лінкер.Абсолютна навантаження, перенесення навантаження та динамічне завантаження.

Визначення лінкера

Асемблер генерує об'єктний код вихідної програми і передає її лінкеру. Лінкер приймає цей об'єктний код і генерує виконуваний код програми і передає його на завантажувач.

У мові високого рівня програми мають вбудовані бібліотеки та файли заголовків . Вихідна програма може містити деякі бібліотечні функції, визначення яких зберігаються у вбудованих бібліотеках. Лінкер зв'язує ці функції з вбудованими бібліотеками. У випадку, якщо вбудовані бібліотеки не знайдені, він інформує компілятор, і компілятор потім генерує помилку.

Іноді великі програми поділяються на підпрограми, які називаються модулями . Тепер, коли ці модулі компілюються і збираються, генеруються модулі об'єктів вихідної програми. Лінкер відповідає за об'єднання / зв'язування всіх модулів об'єкта для створення одного виконуваного файлу вихідної програми. У нас є два типи лінкерів.

Редактор зв'язків : це лінкер, який генерує пересувний, виконуваний модуль.

Динамічний лінкер : він відкладає / відкладає зв'язок деяких зовнішніх модулів, поки не згенерується модуль завантаження / виконуваний модуль. Тут посилання відбувається під час завантаження або часу виконання.

Визначення навантажувача

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

Існує три види підходів до завантаження:

  • Абсолютне навантаження
  • Перенесення навантаження
  • Динамічне завантаження під час виконання

Абсолютне завантаження : Цей підхід завантажує виконуваний файл програми в одне і те ж місце основної пам'яті кожного разу. Але він має деякі недоліки, як програміст повинен знати стратегію призначення для завантаження модулів в основну пам'ять. У випадку, якщо програма повинна бути модифікована, включаючи деякі вставки та видалення в програмі, то всі адреси програми повинні бути змінені.

Перенесення завантаження: у цьому підході компілятор або асемблер не виробляють фактичної адреси основної пам'яті . Вона виробляє відносні адреси.

Динамічне завантаження під час виконання : при такому підході абсолютна адреса для програми генерується, коли дійсно виконується інструкція виконуваного модуля. Він дуже гнучкий, завантажуваний модуль / виконуваний модуль може бути завантажений в будь-яку область основної пам'яті . Програма виконання може бути перервана між собою і може бути замінена на диск і назад на основну пам'ять цього разу на іншу основну адресу пам'яті.

Ключові відмінності між лінкером і навантажувачем

  1. Ключова відмінність між компонувачем і завантажувачем полягає в тому, що лінкер генерує виконуваний файл програми, тоді як завантажувач завантажує виконуваний файл, отриманий з лінкера, в основну пам'ять для виконання .
  2. Лінкер сполучає об'єктний модуль програми, згенерованої асемблером. Проте завантажувач завантажує виконуваний модуль, згенерований лінкером.
  3. Лінкер поєднує в собі всі об'єктні модулі програми для створення виконуваних модулів, а також пов'язує бібліотечну функцію в об'єктному модулі з вбудованими бібліотеками мови програмування високого рівня. З іншого боку, завантажувач виділяє простір виконуваному модулю в основній пам'яті.
  4. Лінкер можна класифікувати як редактор зв'язків, а динамічний лінкер, в той час як завантажувач можна класифікувати як абсолютний завантажувач, переміщуваний завантажувач і динамічний завантажувач часу виконання .

Висновок:

Лінкер бере об'єктні модулі програми від асемблера і з'єднує їх разом, щоб створити виконуваний модуль програми. Після цього виконуваний модуль завантажується завантажувачем у основну пам'ять для виконання.

Top