Dynamický linker - Dynamic linker

v výpočetní, a dynamický linker je součástí operační systém že zatížení a Odkazy the sdílené knihovny potřebné pro spustitelný při spuštění (v „doba běhu ") zkopírováním obsahu knihoven z trvalé úložiště na RAM, plnění skokové stoly a přemístění ukazatele. Specifický operační systém a spustitelný formát určují, jak dynamický linker funguje a jak je implementován.

Propojení se často označuje jako proces, který se provádí, když je spustitelný soubor sestaven, zatímco dynamický linker je speciální součástí operačního systému, který načítá externí sdílené knihovny do běžícího proces a pak váže tyto sdílené knihovny dynamicky do provozu proces. Tento přístup se také nazývá dynamické propojení nebo pozdní propojení.

Implementace

Microsoft Windows

Knihovna dynamických odkazů, nebo DLL, je Microsoft implementace sdílená knihovna koncept v Microsoft Windows a OS / 2 operační systémy. Tyto knihovny obvykle mají přípona souboru DLL, OCX (pro knihovny obsahující ActiveX ovládací prvky), nebo DRV (pro dědictví ovladače systému ). Formáty souborů pro DLL jsou stejné jako pro Windows EXE soubory - to znamená, Přenosný spustitelný soubor (PE) pro 32-bit a 64-bit Windows a Nový spustitelný soubor (NE) pro 16-bit Okna. Stejně jako soubory EXE mohou obsahovat DLL kód, data, a zdroje, v jakékoli kombinaci.

Data soubory se stejným formát souboru jako DLL, ale s různými příponami souborů a případně obsahujícími pouze oddíly prostředků, lze nazvat zdrojovými DLL. Mezi příklady takových DLL patří ikona knihovny, někdy s příponou ICL, a písmo soubory s příponami FON a FOT.[1]

Unixové systémy využívající ELF a systémy založené na Darwinu

Ve většině Unixový systémy, většina strojového kódu, který tvoří dynamický linker, je ve skutečnosti externím spustitelným souborem operačního systému jádro načte a provede se nejprve v adresním prostoru procesu nově vytvořeném v důsledku volání vykon nebo posix_spawn funkce. 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 tento pokus selže, protože například neexistuje žádný soubor s touto cestou, pokus o provedení 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ýsledkem je, že cesta dynamického linkeru je součástí operačního systému binární rozhraní aplikace.

Systémy využívající ELF

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

Dynamický linker lze ovlivnit tak, že upraví jeho chování během provádění programu nebo při propojování programu a jeho příklady lze vidět na manuálových stránkách linkerů za běhu pro různé systémy podobné Unixu.[2][3][4][5][6] Typickou změnou tohoto chování je použití LD_LIBRARY_PATH a LD_PRELOAD proměnné prostředí, které upravují runtime linking proces hledáním sdílených knihoven na alternativních místech a násilným načítáním a linkováním knihoven, které by jinak nebyly. Příkladem je zlibc,[7] také známý jako dekomprimovat. tak,[A] což usnadňuje transparentní dekompresi při použití prostřednictvím LD_PRELOAD zaseknout; ve výsledku je možné číst předkomprimovaná (gzipovaná) data souborů na systémech BSD a Linux, jako by soubory nebyly komprimovány, což v podstatě umožňuje uživateli přidat transparentní kompresi do základního souborového systému, i když s některými upozorněními. Mechanismus je flexibilní a umožňuje triviální adaptaci stejného kódu k provádění dalšího nebo alternativního zpracování dat během čtení souboru před poskytnutím uvedených dat uživatelskému procesu, který o to požádal.[8][9]

macOS a iOS

V Apple Darwine operační systém a Operační Systém Mac a iOS operační systémy postavené na jeho vrcholu, je cesta dynamického linkeru, který by měl být použit, vložena v době propojení do jednoho z Mach-O načíst příkazy do spustitelného obrazu. V těchto systémech lze dynamicky načítané sdílené knihovny identifikovat buď podle přípony názvu souboru .dylib nebo jejich umístěním uvnitř svazek pro rámec.

Dynamický linker nejen propojuje cílový spustitelný soubor se sdílenými knihovnami, ale také umisťuje funkce strojového kódu na konkrétní adresové 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 volání specifické pro stroj nebo instrukci skoku do jednoho z těchto známých adresových bodů. Spustitelné soubory na platformách macOS a iOS často interagují 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ů, několik hodin po prvním spuštění. Důvod, proč program macOS nebo iOS tak často interaguje s dynamickým linkerem, je způsoben jak Apple Kakao a Kakaový dotek API a Cíl-C, jazyk, ve kterém jsou implementovány (další informace najdete v jejich hlavních článcích).

Dynamický linker může být vynucen do úpravy některých jeho 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é mohou být (a někdy jsou) ignorovány dynamickým linkerem. Příklady toho lze vidět v dyldmanuální stránka.[10] Typickou změnou tohoto chování je použití DYLD_FRAMEWORK_PATH a DYLD_PRINT_LIBRARIES proměnné prostředí. První z výše uvedených proměnných upravuje vyhledávací cestu spustitelných souborů pro sdílené knihovny, zatímco druhá zobrazuje názvy knihoven, jak jsou načteny a propojeny.

Dynamický linker pro MacOS společnosti Apple je open-source projekt vydaný jako součást Darwine a lze je najít v open-source systému Apple dyld projekt.[11]

Systémy podobné Unixu založené na XCOFF

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

Dynamický linker lze ovlivnit tak, že změní jeho chování během provádění programu nebo při propojování programu. Typickou změnou tohoto chování je použití LIBPATH proměnná prostředí.Tato proměnná upravuje proces propojení běhového prostředí hledá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 jeho nástupci

Dynamické propojení z jazykových programů Assembleru v systému Windows IBM OS / 360 a jeho nástupci se obvykle provádí pomocí instrukce makra LINK obsahující a Pokyny pro volání supervizora který aktivuje rutiny operačního systému, díky nimž je modul knihovny propojen s programem. Moduly knihovny mohou být umístěny v „STEPLIB“ nebo „JOBLIB“ uvedeném na řídicích kartách a jsou k dispozici pouze pro konkrétní spuštění programu, v knihovně zahrnuté v LINKLISTU v PARMLIBU (zadaném při spuštění systému) nebo v oblast propojovacích balíků ", kde jsou v době spuštění systému načteny konkrétní reentrantní moduly.

Multics

V Multics operační systém všechny soubory, včetně spustitelných souborů, jsou 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 spuštěného procesu. Dynamické propojení je normální způsob provozu a statické propojení (pomocí pořadač) je výjimkou.

Účinnost

Dynamické propojení je obecně pomalejší (vyžaduje více cyklů CPU) než propojení během kompilace,[12] 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 propojena staticky, každý spuštěný proces je propojen s vlastní kopií funkcí knihovny, která je vyvolána. Proto pokud je knihovna mnohokrát vyvolána různými programy, stejné funkce v této knihovně jsou duplikovány na několika místech v paměti systému. Používání sdílených dynamických knihoven znamená, že namísto propojení každého souboru s vlastní kopií knihovny v době kompilace a potenciálního plýtvání paměťovým prostorem je do paměti vždy uložena pouze jedna kopie knihovny, což uvolňuje místo v paměti použitý jinde.[13] Kromě toho se v dynamickém propojení knihovna načte pouze v případě, že se skutečně používá.[14]

Viz také

Poznámky

  1. ^ Nesmí být zaměňována s zlib kompresní knihovna.

Reference

  1. ^ Společnost Microsoft. "Vytvoření DLL pouze pro zdroje". Microsoft Developer Network Library.
  2. ^ ld.so.1 (1): Solaris dynamický linker / nakladač -Solaris 10 Reference uživatelských příkazů Manuál
  3. ^ ld-linux.so (8) – Linux Programátor Manuál - Správa a privilegované příkazy
  4. ^ rtld (1): FreeBSD dynamic linker / loader -FreeBSD Obecné příkazy Manuál
  5. ^ ld.elf_so (1): NetBSD dynamický linker / zavaděč -NetBSD Obecné příkazy Manuál
  6. ^ ld.so (1): OpenBSD dynamický linker / loader -OpenBSD Obecné příkazy Manuál
  7. ^ https://www.zlibc.linux.lu/
  8. ^ "uncompress.so". delorie.com. Citováno 2014-07-04.
  9. ^ "zlibc.conf". delorie.com. Citováno 2014-07-04.
  10. ^ dyld (1): Darwin / Mac OS X dynamický linker / loader -Darwine a Operační Systém Mac Obecné příkazy Manuál
  11. ^ Apple Inc. „Open Source - zprávy“. apple.com. Citováno 2014-07-04.
  12. ^ Xuxian, Jiang (2009). „Principy operačních systémů: Propojování a načítání“ (PDF). Státní univerzita v Severní Karolíně. Citováno 2020-09-24.
  13. ^ Jones, M. (2008-08-28). "Anatomie dynamických knihoven Linuxu". IBM. Citováno 2020-09-24.
  14. ^ Sivilotti, Paul (srpen 2012). „Dynamické propojení a načítání“ (PDF). Ohio State University. Citováno 2020-09-24.

Další čtení

externí odkazy