Linker (výpočetní) - Linker (computing)

Ukázka procesu propojení. Soubory objektů a statické knihovny jsou sestaveny do nové knihovny nebo spustitelného souboru

V oblasti výpočetní techniky je linker nebo editor odkazů program počítačového systému, který převezme jeden nebo více souborů objektů (generovaných kompilátorem nebo assemblerem ) a zkombinuje je do jednoho spustitelného souboru, souboru knihovny nebo jiného souboru „objektu“.

Jednodušší verze, která zapisuje svůj výstup přímo do paměti, se nazývá zavaděč , ačkoli načítání je obvykle považováno za samostatný proces.

Přehled

Počítačové programy se obvykle skládají z několika částí nebo modulů; tyto části/moduly nemusí být obsaženy v jednom souboru objektů a v takových případech se navzájem odkazují pomocí symbolů jako adresy do jiných modulů, které jsou mapovány na adresy paměti, když jsou propojeny za účelem provedení. Soubor objektu může obvykle obsahovat tři druhy symbolů:

  • definované „externí“ symboly, někdy nazývané „veřejné“ nebo „vstupní“ symboly, které umožňují jeho volání jinými moduly,
  • nedefinované „externí“ symboly, které odkazují na jiné moduly, kde jsou tyto symboly definovány, a
  • místní symboly, používané interně v rámci souboru objektu k usnadnění přemístění .

U většiny překladačů je každý objektový soubor výsledkem kompilace jednoho souboru vstupního zdrojového kódu. Když program obsahuje více objektových souborů, spojovač spojí tyto soubory do jednotného spustitelného programu a vyřeší symboly za pochodu.

Linkery mohou přijímat objekty ze sbírky nazývané knihovna nebo runtime knihovna . Většina linkerů nezahrnuje do výstupu celou knihovnu; obsahují pouze soubory, na které odkazují jiné objektové soubory nebo knihovny. Propojování knihoven může být tedy iterativní proces, přičemž některé odkazované moduly vyžadují propojení dalších modulů atd. Knihovny existují pro různé účely a jedna nebo více systémových knihoven je obvykle ve výchozím nastavení propojeno.

Linker se také stará o uspořádání objektů v adresním prostoru programu . To může zahrnovat přemístění kódu, který předpokládá konkrétní základní adresu, do jiné základny. Protože kompilátor zřídka ví, kde bude objekt umístěn, často předpokládá pevné základní umístění (například nulu ). Přemístění strojového kódu může zahrnovat opětovné cílení absolutních skoků, zatížení a obchodů.

Spustitelný výstup linkeru může při dalším načtení do paměti (těsně před spuštěním) potřebovat další průchod pro přemístění. Tento průchod je obvykle u hardwaru nabízejícího virtuální paměť vynechán : každý program je vložen do vlastního adresního prostoru, takže nedochází ke konfliktu, i když se všechny programy načítají na stejné základní adrese. Tento průchod lze také vynechat, pokud je spustitelný soubor nezávislý na poloze .

U některých unixových variant, jako je SINTRAN III , se proces prováděný linkerem (sestavování objektových souborů do programu) nazýval načítání (jako při načítání spustitelného kódu do souboru). V některých operačních systémech navíc stejný program zpracovává úlohy propojení i načítání programu ( dynamické propojení ).

Dynamické propojení

Mnoho prostředí operačního systému umožňuje dynamické propojení a odkládá rozlišení některých nedefinovaných symbolů, dokud není spuštěn program. To znamená, že spustitelný kód stále obsahuje nedefinované symboly a seznam objektů nebo knihoven, které pro ně poskytnou definice. Načtení programu načte také tyto objekty/knihovny a provede konečné propojení.

Tento přístup nabízí dvě výhody:

  • Často používané knihovny (například standardní systémové knihovny) musí být uloženy pouze na jednom místě, nikoli duplikovány v každém spustitelném souboru, čímž se ušetří omezená paměť a místo na disku .
  • Pokud je chyba ve funkci knihovny opravena nahrazením knihovny, všechny programy, které ji používají dynamicky, budou mít z opravy po jejich restartu prospěch. Programy, které tuto funkci zahrnovaly statickým propojováním, by musely být nejprve znovu propojeny.

Existují také nevýhody:

  • Kompatibilní aktualizovaná knihovna známá na platformě Windows jako „ DLL peklo “ přeruší spustitelné soubory, které závisely na chování předchozí verze knihovny, pokud novější verze není zpětně kompatibilní .
  • Program spolu s knihovnami, které používá, může být certifikován (např. Co se týče správnosti, požadavků na dokumentaci nebo výkonu) jako balíček, ale ne v případě, že lze vyměnit součásti (to také argumentuje proti automatické aktualizaci OS v kritických systémech; v obou případy, OS a knihovny tvoří součást kvalifikovaného prostředí).

Statické propojení

Statické propojení je výsledkem toho, že linker zkopíruje všechny rutiny knihovny použité v programu do spustitelného obrazu. To může vyžadovat více místa na disku a paměti než dynamické propojení, ale je přenosnější, protože nevyžaduje přítomnost knihovny v systému, kde běží. Statické propojení také zabraňuje „peklu DLL“, protože každý program obsahuje přesně ty verze knihovních rutin, které vyžaduje, bez konfliktu s jinými programy. Program využívající jen několik rutin z knihovny nevyžaduje instalaci celé knihovny.

Přemístění

Protože kompilátor nemá žádné informace o rozložení objektů v konečném výstupu, nemůže využít výhod kratších nebo efektivnějších instrukcí, které kladou požadavek na adresu jiného objektu. Například instrukce skoku může odkazovat na absolutní adresu nebo odsazení od aktuálního umístění a posun může být vyjádřen různými délkami v závislosti na vzdálenosti k cíli. První generací nejkonzervativnější instrukce (obvykle největší relativní nebo absolutní varianta, v závislosti na platformě) a přidáním relaxačních rad je možné během konečného odkazu nahradit kratší nebo efektivnější instrukce. Pokud jde o optimalizace skoků, toto se také nazývá automatické nastavení velikosti skoku . Tento krok lze provést až poté, co byly načteny všechny vstupní objekty a přiřazeny dočasné adresy; linker relaxace nahrávka následně přiřadí adresy, které mohou následně mohlo dojít k další potenciální relaxace. Substituované sekvence jsou obecně kratší, což umožňuje, aby tento proces vždy konvergoval k nejlepšímu řešení při daném pevném pořadí objektů; pokud tomu tak není, relaxace mohou být v konfliktu a linker musí zvážit výhody obou možností.

Zatímco relaxace instrukcí obvykle probíhá v době propojení, relaxace vnitřního modulu již může probíhat jako součást optimalizačního procesu v době kompilace . V některých případech může relaxace také nastat v době načítání jako součást procesu přemístění nebo v kombinaci s technikami dynamické eliminace mrtvého kódu .

Spojovací editor

V prostředích sálových počítačů IBM System/360, jako je OS/360 , včetně z/OS pro hlavní počítače z/Architecture , je tento typ programu známý jako editor vazeb . Jak název napovídá, editor vazeb má další možnosti umožňující přidávání, nahrazování a/nebo mazání jednotlivých sekcí programu. Operační systémy, jako je OS/360, mají formát spustitelných zaváděcích modulů obsahujících doplňková data o jednotlivých částech programu, takže je možné vyměnit jednotlivou část programu a aktualizovat další části programu, aby bylo možné přemístitelné adresy a další reference být opraveno editorem propojení, jako součást procesu.

Jednou z výhod této skutečnosti je, že umožňuje údržbu programu, aniž by bylo nutné uchovávat všechny soubory mezilehlých objektů, nebo bez nutnosti znovu kompilovat části programu, které se nezměnily. Rovněž umožňuje distribuci aktualizací programu ve formě malých souborů (původně balíčky karet ), které obsahují pouze modul objektu, který má být nahrazen. V takových systémech je objektový kód ve formě a formátu 80bajtových obrázků děrné karty, takže aktualizace lze zavést do systému pomocí tohoto média. V novějších verzích OS/360 a v dalších systémech obsahují zaváděcí moduly další data o verzích modulů součástí, aby bylo možné vytvořit sledovatelný záznam aktualizací. Umožňuje také přidat, změnit nebo odebrat překryvnou strukturu z již propojeného zaváděcího modulu.

Pojem „editor vazeb“ by neměl být vykládán tak, že naznačuje, že program pracuje v uživatelsky interaktivním režimu jako textový editor. Je určen pro provádění v dávkovém režimu, přičemž editační příkazy dodává uživatel v sekvenčně organizovaných souborech, jako jsou děrné karty , DASD nebo magnetická páska , a pásky byly často používány během počáteční instalace operačního systému.

Editace propojení ( nomenklatura IBM ) nebo konsolidace nebo kolekce ( nomenklatura ICL ) označuje akt editora nebo konsolidátoru propojení, který kombinuje různé části do přemístitelného binárního souboru, zatímco načítání a přemisťování do absolutního binárního souboru na cílové adrese je normálně považováno za samostatný krok.

Běžné implementace

V systémech Unix a Unix podobných je linker známý jako „ld“. Počátky názvu „ld“ jsou „LoaDer“ a „Link eDitor“. Termín „zavaděč“ byl použit k popisu procesu načítání externích symbolů z jiných programů během procesu propojení.

GNU linker

GNU linker (nebo GNU ld) je projekt GNU ‚s free software realizace příkazu ld Unix. GNU ld spustí linker, který vytvoří spustitelný soubor (nebo knihovnu) z objektových souborů vytvořených během kompilace softwarového projektu. Linker skript může být předán do GNU ld vykonávat větší kontrolu nad procesem propojení. Linker GNU je součástí binárních nástrojů GNU Binary Utilities (binutils). V binutils jsou k dispozici dvě verze ld: tradiční GNU ld založené na bfd a „zjednodušená“ verze pouze pro ELF s názvem gold .

Syntaxe skriptů příkazového řádku a linkeru GNU ld je de facto standardem ve velké části světa podobného Unixu . The LLVM projektu linker, lld , je navržen tak, aby byl kompatibilní s možností zasunutí .

Viz také

Reference

Další čtení

externí odkazy