Діаграма порівняння
Основа для порівняння | Linker | Навантажувач |
---|---|---|
Основний | Він генерує виконуваний модуль вихідної програми. | Він завантажує виконуваний модуль в основну пам'ять. |
Вхідні дані | Він приймає як вхідний код об'єктний код, згенерований асемблером. | Він приймає виконуваний модуль, згенерований лінкером. |
Функція | Він поєднує в собі всі об'єктні модулі вихідного коду для створення виконуваного модуля. | Він виділяє адреси виконуваному модулю в основній пам'яті для виконання. |
Тип / підхід | Редактор зв'язків, динамічний лінкер. | Абсолютна навантаження, перенесення навантаження та динамічне завантаження. |
Визначення лінкера
Асемблер генерує об'єктний код вихідної програми і передає її лінкеру. Лінкер приймає цей об'єктний код і генерує виконуваний код програми і передає його на завантажувач.
У мові високого рівня програми мають вбудовані бібліотеки та файли заголовків . Вихідна програма може містити деякі бібліотечні функції, визначення яких зберігаються у вбудованих бібліотеках. Лінкер зв'язує ці функції з вбудованими бібліотеками. У випадку, якщо вбудовані бібліотеки не знайдені, він інформує компілятор, і компілятор потім генерує помилку.
Іноді великі програми поділяються на підпрограми, які називаються модулями . Тепер, коли ці модулі компілюються і збираються, генеруються модулі об'єктів вихідної програми. Лінкер відповідає за об'єднання / зв'язування всіх модулів об'єкта для створення одного виконуваного файлу вихідної програми. У нас є два типи лінкерів.
Редактор зв'язків : це лінкер, який генерує пересувний, виконуваний модуль.
Динамічний лінкер : він відкладає / відкладає зв'язок деяких зовнішніх модулів, поки не згенерується модуль завантаження / виконуваний модуль. Тут посилання відбувається під час завантаження або часу виконання.
Визначення навантажувача
Оскільки програма, яка повинна бути виконана в даний час, повинна знаходитися в основній пам'яті комп'ютера. Відповідальність завантажувача, програми в операційній системі, - завантажувати виконуваний файл / модуль програми, згенерований лінкером, в основну пам'ять для виконання. Він виділяє простір пам'яті до виконуваного модуля в основній пам'яті.
Існує три види підходів до завантаження:
- Абсолютне навантаження
- Перенесення навантаження
- Динамічне завантаження під час виконання
Абсолютне завантаження : Цей підхід завантажує виконуваний файл програми в одне і те ж місце основної пам'яті кожного разу. Але він має деякі недоліки, як програміст повинен знати стратегію призначення для завантаження модулів в основну пам'ять. У випадку, якщо програма повинна бути модифікована, включаючи деякі вставки та видалення в програмі, то всі адреси програми повинні бути змінені.
Перенесення завантаження: у цьому підході компілятор або асемблер не виробляють фактичної адреси основної пам'яті . Вона виробляє відносні адреси.
Динамічне завантаження під час виконання : при такому підході абсолютна адреса для програми генерується, коли дійсно виконується інструкція виконуваного модуля. Він дуже гнучкий, завантажуваний модуль / виконуваний модуль може бути завантажений в будь-яку область основної пам'яті . Програма виконання може бути перервана між собою і може бути замінена на диск і назад на основну пам'ять цього разу на іншу основну адресу пам'яті.
Ключові відмінності між лінкером і навантажувачем
- Ключова відмінність між компонувачем і завантажувачем полягає в тому, що лінкер генерує виконуваний файл програми, тоді як завантажувач завантажує виконуваний файл, отриманий з лінкера, в основну пам'ять для виконання .
- Лінкер сполучає об'єктний модуль програми, згенерованої асемблером. Проте завантажувач завантажує виконуваний модуль, згенерований лінкером.
- Лінкер поєднує в собі всі об'єктні модулі програми для створення виконуваних модулів, а також пов'язує бібліотечну функцію в об'єктному модулі з вбудованими бібліотеками мови програмування високого рівня. З іншого боку, завантажувач виділяє простір виконуваному модулю в основній пам'яті.
- Лінкер можна класифікувати як редактор зв'язків, а динамічний лінкер, в той час як завантажувач можна класифікувати як абсолютний завантажувач, переміщуваний завантажувач і динамічний завантажувач часу виконання .
Висновок:
Лінкер бере об'єктні модулі програми від асемблера і з'єднує їх разом, щоб створити виконуваний модуль програми. Після цього виконуваний модуль завантажується завантажувачем у основну пам'ять для виконання.