Динамічний лінкер

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Динамічний лінкер (або динамічний компонувальник, програма динамічного зв'язування) — частина операційної системи, що завантажує і лінкує спільні бібліотеки (англ. shared libraries), необхідні виконуваному файлу для початку виконання. Таке лінкування здійснюється шляхом копіювання секцій бібліотеки з диска до оперативної пам'яті (якщо цей крок ще не було зроблено), і налаштування адрес, що посилаються на бібліотечні функції, у виконуваному файлі («релокація»). Точні механізми того, як завантажуються і лінкуються бібліотеки, повністю залежать від операційної системи і використовуваних форматів двійкових файлів.

Терміном «компонування» часто називають процес саме статичної побудови програми, в той час як динамічне лінкування відбувається коли програма запускається на виконання.

Unix-подібні операційні системи[ред. | ред. код]

ELF[ред. | ред. код]

Завантаження динамічної програми у Unix-подібній операційній системі, заснованій на форматі ELF, починається так само, як і статичної: ядро ОС відображує[en] виконуваний файл у оперативній пам'яті. Далі починаються відмінності: у динамічній програмі присутня секція INTERPRETER, де зазначено ім'я файла динамічного лінкера (таке, як ld.so або ld-linux.so), який ядро також відображує на пам'ять і запускає. Динамічному лінкеру як параметри передаються такі важливі елементи, як фізична адреса і структура заголовку програми, її початкова адреса виконання (англ. entry point) і адреса, за якою завантажений сам лінкер.[1] Маючи цю інформацію, лінкер при потребі завантажує потрібні динамічні бібліотеки і ініціалізує елементи таблиці символів у програмі, записуючи туди адреси бібліотечних процедур. Для прискорення роботи з таблицями використовується гешування.

Для забезпечення гнучкості динамічного компонування активно використовуються механізми GOT (Global offset table), PLT (Procedure linkage table) і позиційно-незалежний код. PLT дозволяє організацію так званого «лінивого лінкування», коли прив'язування до адреси бібліотечної функції здійснюється лише при зверненні до неї. Це може бути корисним, якщо динамічна бібліотека (така, наприклад, як libc) містить тисячі функцій, а програмі потрібні лише кілька з них.

Користувач сам може змінити процес пошуку динамічних бібліотек за допомогою змінних середовища, що керують роботою динамічного лінкера. Зокрема, змінна LD_LIBRARY_PATH дозволяє вказати шлях у файловій системі, де бібліотеки шукатимуться у першу чергу.

Імена файлів бібліотек, з якими лінкер вже мав справу, і шляхи доступу до них зберігаються у спеціальному файлі кешування (ld.so.cache).

Microsoft Windows[ред. | ред. код]

Докладніше: Dynamic-link library

Динамічно-приєднувані бібліотеки (DLL) — реалізація концепції спільних бібліотек, здійснена Microsoft у операційних системах Microsoft Windows і OS/2. DLL у Windows можуть крім коду і даних містити також ресурси.

OS/360 і наступники[ред. | ред. код]

У OS/360 при написанні програм на асемблері динамічне лінкування здійснюється за допомогою макроса LINK, що містить інструкцію виклику супервізора ОС. У результаті потрібний бібліотечний модуль стає доступним програмі. У JCL імена бібліотек можуть вказуватися у операторах STEPLIB або JOBLIB (доступні лише для конкретного екземпляру виконання програми), а також (при старті системи) у команді LINKLIST / PARMLIB, або у спеціальній області «link pack area», де вказуються реентрантні модулі, які система має завантажити при своєму запуску.

Multics[ред. | ред. код]

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

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]

  1. Levine, John R. (2000). 10. Dynamic linking and loading. Linkers and Loaders (англ.). Morgan Kaufmann. ISBN 978-1-55860-496-4. Архів оригіналу за 8 жовтня 2011. Процитовано 25 лютого 2020.