Dynamický linker - Dynamic linker

Ve výpočtu , je dynamický linker je součástí operačního systému , který načte a odkazy na sdílené knihovny potřebné pomocí spustitelného souboru , je-li spuštěn (v „ běhu “), od kopírování obsahu knihoven z trvalého úložiště do paměti RAM , plnicí skok tabulky a přemístění ukazatelů . Konkrétní operační systém a spustitelný formát určují, jak dynamický linker funguje a jak je implementován.

Propojení je často označováno jako proces, který se provádí při kompilaci spustitelného souboru , zatímco dynamický linker je speciální součástí operačního systému, který načítá externí sdílené knihovny do spuštěného procesu a poté tyto sdílené knihovny dynamicky váže na spuštěný proces . Tento přístup se také nazývá dynamické propojení nebo pozdní propojení .

Implementace

Microsoft Windows

Dynamické knihovny nebo DLL, je Microsoft je realizace sdílené knihovny koncepce v Microsoft Windows a OS / 2 operační systémy . Tyto knihovny mají obvykle příponu souboru DLL , OCX(pro knihovny, které obsahují prvky ActiveX ovládací prvky), nebo DRV(pro starší řidiče systému ). Formáty souborů pro knihovny DLL jsou stejné jako pro soubory Windows EXE -tj. Portable Executable (PE) pro 32bitová a 64bitová Windows a New Executable (NE) pro 16bitová Windows. Stejně jako u EXE mohou DLL obsahovat kód , data a prostředky v jakékoli kombinaci.

Datové soubory se stejným formátem souboru jako DLL, ale s různými příponami souborů a případně obsahující pouze oddíly prostředků, lze nazvat prostředky DLL. Mezi příklady takových knihoven DLL patří knihovny ikon , někdy s příponou ICL, a soubory písem s příponami FONa FOT.

Unixové systémy využívající systémy ELF a Darwin

Ve většině unixových systémů je většina strojového kódu, který tvoří dynamický linker, ve skutečnosti externím spustitelným souborem, který jádro operačního systému načte a spustí jako první v nově vytvořeném adresním prostoru procesu v důsledku volání execnebo posix_spawnfunkcí. V době propojení je cesta dynamického linkeru, který by měl být použit, vložena do spustitelného obrazu.

Když je načten spustitelný soubor, jádro operačního systému z něj načte cestu dynamického linkeru a poté se pokusí načíst a spustit tento další spustitelný binární soubor; pokud se tento pokus nezdaří, protože například s touto cestou neexistuje žádný soubor, pokus o spuštění původního spustitelného souboru selže. Dynamický linker poté načte počáteční spustitelný obrázek a všechny dynamicky propojené knihovny, na kterých závisí, a spustí spustitelný soubor. V důsledku toho je název cesty dynamického linkeru součástí binárního rozhraní aplikace operačního systému .

Systémy využívající ELF

V unixových systémech, které používají ELF pro spustitelné obrázky a dynamické knihovny, jako je Solaris , 64bitové verze HP-UX , Linux , FreeBSD , NetBSD , OpenBSD a DragonFly BSD , cesta dynamického linkeru, který by měl být použit je vložen v době propojení do .interpsekce PT_INTERPsegmentu spustitelného souboru . V těchto systémech lze dynamicky načtené sdílené knihovny identifikovat podle přípony názvu souboru .so(sdílený objekt).

Dynamický linker lze ovlivnit změnou jeho chování buď během provádění programu, nebo při propojování programu, a příklady toho lze vidět na manuálových stránkách run-time linkeru pro různé unixové systémy. Typickou modifikací tohoto chování je použití proměnnýchLD_LIBRARY_PATH a LD_PRELOAD prostředí , které upravují proces propojení za běhu vyhledáváním sdílených knihoven na alternativních místech a násilným načítáním a propojováním knihoven, které by jinak nebyly. Příkladem je zlibc, také známý jako uncompress.so, což usnadňuje transparentní dekomprese při použití přes LD_PRELOAD hack ; v důsledku toho je možné číst předem komprimovaná (gzipovaná) data souborů na systémech BSD a Linux, jako kdyby soubory nebyly komprimovány, což v podstatě umožňuje uživateli přidat transparentní kompresi k základnímu souborovému systému, i když s určitými výhradami. Mechanismus je flexibilní, což umožňuje triviální přizpůsobení stejného kódu provádět další nebo alternativní zpracování dat během čtení souboru, před poskytnutím uvedených dat uživatelskému procesu, který o to požádal.

macOS a iOS

V operačním systému Apple Darwin a v operačních systémech macOS a iOS postavených na něm je cesta dynamického linkeru, který by měl být použit, vložena v době propojení do jednoho z příkazů Mach-O load v spustitelném obrazu. V těchto systémech lze dynamicky načtené sdílené knihovny identifikovat buď podle přípony názvu souboru, .dylibnebo podle jejich umístění uvnitř svazku pro rámec.

Dynamický linker nejen propojuje cílový spustitelný soubor se sdílenými knihovnami, ale také umísťuje funkce strojového kódu na konkrétní adresní body v paměti, o kterých cílový spustitelný soubor ví v době propojení. Když si spustitelný soubor přeje komunikovat s dynamickým linkerem, jednoduše provede instrukci volání nebo přeskoku specifického pro počítač do jednoho z těchto dobře známých adresních bodů. Spustitelné soubory na platformách macOS a iOS často spolupracují s dynamickým linkerem během provádění procesu; je dokonce známo, že spustitelný soubor může interagovat s dynamickým linkerem, což způsobí, že načte více knihoven a vyřeší více symbolů, hodiny po jeho prvním spuštění. Důvod, proč program macOS nebo iOS tak často interaguje s dynamickým linkerem, je způsoben rozhraními Apple Cocoa a Cocoa Touch API a Objective-C , jazykem, ve kterém jsou implementovány (další informace najdete v jejich hlavních článcích).

Dynamický linker lze donutit upravit některé ze svých chování; na rozdíl od jiných operačních systémů podobných Unixu jsou však tyto úpravy nápovědami, které může (a někdy je) dynamický linker ignorovat. Příklady toho lze vidět na dyldstránce manuálu. Typickou modifikací tohoto chování je použití proměnných DYLD_FRAMEWORK_PATHa DYLD_PRINT_LIBRARIESprostředí. První z výše uvedených proměnných upravuje cestu pro hledání spustitelných souborů pro sdílené knihovny, zatímco druhá zobrazuje názvy knihoven při jejich načítání a propojování.

Dynamický linker Apple macOS je open-source projekt vydaný jako součást Darwinu a lze jej nalézt v open-source dyldprojektu Apple .

Unixové systémy založené na XCOFF

V operačních systémech podobných Unixu využívajících XCOFF , jako je AIX , používají dynamicky načtené sdílené knihovny příponu názvu souboru .a.

Dynamický linker lze ovlivnit změnou jeho chování během provádění programu nebo propojování programu. Typickou modifikací tohoto chování je použití LIBPATH proměnné prostředí . Tato proměnná upravuje proces propojení za běhu vyhledáváním sdílených knihoven na alternativních místech a násilným načítáním a propojováním knihoven, které by jinak nebyly.

OS/360 a nástupci

Dynamické propojení z jazykových programů Assembler v systému IBM OS/360 a jeho následnících se obvykle provádí pomocí makro instrukce LINK obsahující instrukci Call Supervisor, která aktivuje rutiny operačního systému, díky čemuž je modul knihovny k programu dostupný. Moduly knihovny mohou být umístěny v „STEPLIB“ nebo „JOBLIB“ specifikovaném v kontrolních kartách a k dispozici pouze pro konkrétní provedení programu, v knihovně zahrnuté v LINKLIST v PARMLIB (zadáno při spuštění systému) nebo v „ oblast balíčku odkazů “, kde jsou při spuštění systému načteny konkrétní reentrantní moduly.

Multics

V operačním systému Multics jsou všechny soubory, včetně spustitelných souborů, segmenty . Volání rutiny, která není součástí aktuálního segmentu, způsobí, že systém najde odkazovaný segment v paměti nebo na disku a přidá jej do adresního prostoru běžícího procesu. Dynamické propojení je normální způsob provozu a statické propojení (pomocí pořadače ) je výjimkou.

Účinnost

Dynamické propojení je obecně pomalejší (vyžaduje více cyklů CPU) než propojení během kompilace, jako je tomu u většiny procesů prováděných za běhu. Dynamické propojení je však často prostorově efektivnější (na disku a v paměti za běhu). Když je knihovna staticky propojena, každý spuštěný proces je propojen s vlastní kopií vyvolávaných funkcí knihovny. Pokud je tedy knihovna mnohokrát vyvolána různými programy, jsou stejné funkce v této knihovně duplikovány na několika místech v paměti systému. Používání sdílených, dynamických knihoven znamená, že místo propojení každého souboru s jeho vlastní kopií knihovny v době kompilace a potenciálního plýtvání paměťovým prostorem je v paměti vždy uložena vždy jen jedna kopie knihovny, čímž se uvolní místo v paměti. použitý jinde. V dynamickém propojení se navíc knihovna načte, pouze pokud je skutečně používána.

Viz také

Poznámky

Reference

Další čtení

externí odkazy