Linker (számítástechnológia)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Linker.svg/220px-Linker.svg.png)
A számítástechnikában a linker vagy linkszerkesztő a számítógépes rendszer egyik programja, mely egy vagy több objektumfájlt (amelyeket a fordítóprogrammal vagy assemblerrel készítettek) egyesít egy futtatható fájllá, könyvtárfájllá vagy egy másik objektumfájllá.
Egy egyszerűbb verziót, amely közvetlenül a memóriába írja a kimenetét, betöltőnek hívják, bár a betöltést általában külön folyamatnak tekintik.
Áttekintés
Általában a számítógépes programok több részből vagy modulból állnak; ezeket a részeket/modulokat nem kell egyetlen objektumfájlban elhelyezni, és ilyen esetekben szimbólumok segítségével hivatkoznak egymásra más modulok címeiként, amelyek végrehajtáshoz kapcsolódva memória címekbe vannak leképezve. Háromfajta szimbólumot tartalmaz egy objektumfájl
- meghatározott "külső" szimbólumok, amelyeket néha "nyilvános" vagy "belépési" szimbólumoknak is neveznek, amelyek lehetővé teszik más modulok meghívását,
- nem definiált "külső" szimbólumok, amelyek más modulokra hivatkoznak, ahol ezek a szimbólumok meg vannak határozva, és
- helyi szimbólumok, amelyeket az objektumfájlban belül használnak az áthelyezés megkönnyítésére.
A legtöbb fordítóban minden objektumfájl egy bemeneti forráskódfájl összeállításának eredménye. Ha egy program több objektumfájlt tartalmaz, a linker ezeket a fájlokat egyesíti egy futtatható programba, feloldva a szimbólumokat.
A linkelők objektumokat vehetnek egy könyvtárnak vagy futásidejű könyvtárnak nevezett gyűjteményből. A legtöbb linkelő nem tartalmazza a teljes könyvtárat a kimenetben; csak a fájlokat tartalmazzák , amelyekre más objektumfájlok vagy könyvtárak hivatkoznak. A könyvtár összekapcsolása tehát iteratív folyamat lehet, néhány hivatkozott modulhoz további modulok összekapcsolására van szükség stb. A könyvtárak különféle célokra léteznek, és egy vagy több rendszerkönyvtár általában alapértelmezés szerint összekapcsolódik.
A linker gondoskodik az objektumok elrendezéséről is a program címterében. Ez magában foglalhatja egy adott bázis címet feltételező kód áthelyezését egy másik bázisba. Mivel a fordító ritkán tudja, hol található egy objektum, gyakran rögzített alaphelyet vesz fel (például nulla ). A gépi kód áthelyezése magában foglalhatja az abszolút ugrások, terhelések és tárolások újbóli célzását.
A linkelő futtatható kimenetéhez szükség lehet egy másik áthelyezési passzra, amikor végre betölti a memóriába (közvetlenül a végrehajtás előtt). Ezt a hozzáférést a virtuális memóriát kínáló hardvereken általában elhagyják: minden program a saját címterébe kerül, így nincs konfliktus akkor sem, ha az összes program ugyanazon az alapcímen töltődik be. Ez a hozzáférés akkor is elhagyható, ha a futtatható fájl egy pozíciótól független futtatható.
Egyes Unix változatoknál, mint például a SINTRAN III, a linker által végrehajtott folyamatot (az objektumfájlok programba összerakását) betöltésnek nevezték (mint például a futtatható kódfájlba való betöltése esetén). Ezenkívül egyes operációs rendszerekben ugyanaz a program kezeli a program összekapcsolásának és betöltésének ( dinamikus összekapcsolás ) feladatait is.
Dinamikus összekapcsolás
Számos operációs rendszer környezet lehetővé teszi a dinamikus összekapcsolást, elhalasztva egyes meghatározatlan szimbólumok felbontását a program futtatásáig. Ez azt jelenti, hogy a futtatható kód továbbra is tartalmaz meghatározatlan szimbólumokat, valamint egy listát azokról az objektumokról vagy könyvtárakról, amelyek meghatározzák ezeket. A program betöltésével ezeket az objektumokat/könyvtárakat is betöltjük, és végleges linkelést hajtunk végre.
Ez a megközelítés két előnyt kínál:
- A gyakran használt könyvtárakat (például a szokásos rendszerkönyvtárakat) csak egy helyen kell tárolni, nem kell minden más futtatható fájlban lemásolni, ezáltal korlátozott memóriát és lemezterületet takaríthat meg.
- Ha a könyvtár függvényében egy hibát kijavítanak a könyvtár cseréjével, akkor az összes, dinamikusan használó program számára az újraindítás után hasznos lesz a javítás. Azokat a programokat, amelyek statikus összekapcsolással tartalmazzák ezt a funkciót, először újra kell kapcsolni.
Vannak hátrányai is:
- A Windows platformon " DLL pokol " néven ismert, egy nem kompatibilis, frissített könyvtár megszakítja a futtatható fájlokat, amelyek a könyvtár előző verziójának viselkedésétől függtek, ha az újabb verzió tévesen nem kompatibilis a visszafelé.
- Egy program, az általa használt könyvtárakkal együtt, tanúsított lehet (pl. A helyesség, a dokumentációs követelmények vagy a teljesítmény szempontjából) csomagként, de nem, ha az összetevőket ki lehet cserélni (ez a kritikus rendszerek automatikus operációs rendszer-frissítései ellen is szól; esetekben az operációs rendszer és a könyvtárak képzett környezet részét képezik).
Statikus összekapcsolás
A statikus összekapcsolás annak az eredménye, hogy a linker a programban használt összes könyvtári rutint átmásolja a futtatható képbe. Ez több lemezterületet és memóriát igényelhet, mint a dinamikus összekapcsolás, de sokkal hordozhatóbb, mivel nem igényli a könyvtár jelenlétét abban a rendszerben, ahol fut. A statikus összekapcsolás megakadályozza a "DLL poklot" is, mivel minden program pontosan tartalmazza a könyvtár rutinjainak azon verzióit, amelyekre szüksége van, és nem ütközik más programokkal. A könyvtárból csupán néhány rutint használó program nem igényli a teljes könyvtár telepítését.
Áthelyezés
Mivel a fordítónak nincs információja az objektumok elrendezéséről a végső kimenetben, nem tudja kihasználni azokat a rövidebb vagy hatékonyabb utasításokat, amelyek követelményt támasztanak egy másik objektum címére. Például egy ugrási utasítás hivatkozhat egy abszolút címre vagy egy eltolásra az aktuális helytől, és az eltolást különböző hosszúságokkal lehet kifejezni a céltól való távolságtól függően. Először a legkonzervatívabb utasítás előállításával (általában a legnagyobb relatív vagy abszolút változat, platformtól függően) és relaxációs tippek hozzáadásával rövidebb vagy hatékonyabb utasításokat lehet helyettesíteni az utolsó link alatt. Az ugrás szerű optimalizálása kapcsán ezt automatikus ugrásméretezésnek is nevezik. Ez a lépés csak azután hajtható végre, hogy az összes bemeneti objektumot elolvasták és ideiglenes címeket rendeltek hozzájuk; a linker relaxációs passz ezt követően újból hozzárendeli a címeket, ami viszont több potenciális relaxáció bekövetkezését teszi lehetővé. Általában a helyettesített szekvenciák rövidebbek, ami lehetővé teszi, hogy ez a folyamat mindig a legjobb megoldáshoz konvergáljon, adott objektum-sorrendben; ha nem ez a helyzet, akkor a relaxációk ütközhetnek, és a linkernek mérlegelnie kell mindkét lehetőség előnyeit.
Míg az utasítás relaxáció tipikusan link-time történik, a belső modul relaxációja már az optimalizálási folyamat részeként is megvalósulhat fordítási időben. Bizonyos esetekben a relaxáció terheléskor is bekövetkezhet az áthelyezési folyamat részeként vagy dinamikus holtkód-eliminációs technikákkal kombinálva.
Kapcsolatszerkesztő
Az IBM System/360 nagygépes környezetekben, például az OS/360-ban, beleértve a z/OS-t a z/Architecture nagyszámítógépekhez, ez a típusú program összekapcsolás-szerkesztő néven ismert. Ahogy a neve is jelzi, a linkszerkesztő rendelkezik azzal a kiegészítő képességgel, hogy lehetővé teszi az egyes programrészek hozzáadását, cseréjét és/vagy törlését. Az olyan operációs rendszerek, mint az OS/360, rendelkeznek olyan formátumú futtatható betöltőmodulokkal, amelyek kiegészítő adatokat tartalmaznak a program alkotórészeiről, így a folyamat részeként egy-egy programrészletet ki lehet cserélni, és a program más részeit frissíteni lehet, hogy az áthelyezhető címeket és egyéb hivatkozásokat a linkszerkesztővel korrigálni lehessen.
Egyik előnye ennek, hogy lehetővé teszi a program karbantartását anélkül, hogy meg kellene tartania az összes köztes objektumfájlt, vagy anélkül, hogy újra össze kellene állítania a megváltozott programrészeket. Lehetővé teszi azt is, hogy a programfrissítéseket kis fájlok formájában (eredetileg kártyacsomagok ) terjesszék, amelyek csak a kicserélendő objektum modult tartalmazzák. Az objektumkód ilyen rendszerekben 80 bájtos lyukasztott kép formátumú és formátumú, így az adott adathordozó segítségével frissítéseket lehet bevezetni a rendszerbe. Az OS/360 későbbi kiadásaiban és a későbbi rendszerekben a load-modulok további adatokat tartalmaznak az összetevő modulok verzióiról, hogy a frissítések nyomon követhető nyilvántartását hozzák létre. Lehetővé teszi azt is, hogy hozzáadjon, módosítson vagy eltávolítson egy fedvényszerkezetet egy már összekapcsolt terhelési modulból.
A "linkage editor" kifejezés nem értelmezhető úgy, hogy az azt jelenti, hogy a program felhasználói interaktív módban működik, mint egy szövegszerkesztő. Kötegelt üzemmódú végrehajtásra készült, a szerkesztési parancsokat a felhasználó egymás után rendezett fájlokban, például lyukkártyákon, DASD-ben vagy mágnesszalagokon szolgáltatta, és az operációs rendszer kezdeti telepítése során gyakran használtak szalagokat.
A kapcsolatok szerkesztése (IBM-nómenklatúra) vagy az összevonás vagy gyűjtés (ICL-nómenklatúra) a linkszerkesztő vagy a konszolidátor tettére utal, amikor a különféle darabokat áttelepíthető bináris fájlokká egyesítik, míg a célcímben az abszolút binárisba történő betöltést és áthelyezést általában különállónak tekintik.
GNU linker
A GNU linker (vagy GNU ld) a GNU Project által végrehajtott Unix parancs ld. A GNU ld futtatja a linkert, amely egy szoftverprojekt fordítása során létrehozott objektumfájlokból futtatható fájlt (vagy könyvtárat) hoz létre. A linkelő szkript átadható a GNU ld-nek, hogy nagyobb ellenőrzést gyakoroljon a kapcsolási folyamat felett. A GNU linker a GNU bináris segédprogramok (binutils) része. Az ld két verziója található a binutils-ben: a hagyományos GNU ld, amely a bfd-n alapul, és egy csak ELF-hez kiadott, arany nevű változat.
Az "ld" név eredete a " LoaDer " és a "Link eDitor". A "betöltő" kifejezést arra használták, hogy leírja a külső szimbólumok más programokból történő betöltését az összekapcsolás során.
A GNU linker egy ingyenes szoftver, amelyet a GNU General Public License feltételei szerint terjesztenek.
Fordítás
Ez a szócikk részben vagy egészben a Linker (computing) című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
Források
- (1982. április 1.) „A Machine Independent Linker”. Software: Practice and Experience 12 (4), 351–366. o, Kiadó: John Wiley & Sons Ltd. DOI:10.1002/spe.4380120407. ISSN 1097-024X.
- Operating System 360 - Linkage Editor (E) - Program Logic Manual [archivált változat], 3, International Business Machines Corporation. Program number 360S-ED-510. File No. S360-31. Form Y28-6610-2. [June 1967] (1969. július 23.). Hozzáférés ideje: 2020. március 7. [archiválás ideje: 2007. október 1.]
- (1983. augusztus 1.) „Assembly Language as Object Code”. Software: Practice and Experience 13 (8), 715–725. o, Kiadó: John Wiley & Sons Ltd. DOI:10.1002/spe.4380130806. ISSN 1097-024X.
- Levine, John R.. Linkers and Loaders, 1, The Morgan Kaufmann Series in Software Engineering and Programming, San Francisco, USA: Morgan Kaufmann [October 1999] (2000. szeptember 11.). ISBN 1-55860-496-0. OCLC 42413382. Hozzáférés ideje: 2020. január 12. Code: [1][2][halott link] Errata: [3]
- (1972. szeptember 1.) „Linkers and Loaders”. ACM Computing Surveys, University of California, Santa Barbara, California, USA 4, 149–167. o. [2020. március 7-i dátummal az eredetiből archiválva]. DOI:10.1145/356603.356605. (Hozzáférés: 2020. március 7.) (19 pages)
- (1996. május 1.) „Relocating Machine Instructions by Currying” 31 (5), 226–236. o. [2020. május 18-i dátummal az eredetiből archiválva]. DOI:10.1145/249069.231429.
- Ian Lance Justin Linkerei blogbejegyzései
- Linkers and Loaders, a Sandeep Grover Linux Journal című cikke
- Újabb felsorolás arról, hogy hol lehet beszerezni az ingyenes eszközök teljes gyűjteményét az összeállítási nyelv fejlesztéséhez
- GNU linker kézikönyv
- LLD - Az LLVM Linker
- ld(1)