Dynaaminen linkkeri - Dynamic linker

In Computing , joka on dynaaminen linkkeri on osa käyttöjärjestelmää , joka latautuu ja linkit jaetut kirjastot tarvitsemia suoritettavan kun se suoritetaan (at " ajoaika "), kopioimalla sisältö kirjastojen pysyvään muistiin ja RAM , täyttö hyppy pöytiä ja osoittimia . Erityinen käyttöjärjestelmä ja suoritettava muoto määrittävät, miten dynaaminen linkki toimii ja miten se toteutetaan.

Yhdistää usein kutsutaan prosessi, joka suoritetaan, kun suoritettavan on koottu , kun taas dynaaminen linkkeri on erityinen osa käyttöjärjestelmää, joka lataa ulkoista jaettua kirjastoja käynnissä prosessi ja sitten sitoutuu ne jaetut kirjastot dynaamisesti käynnissä prosessi . Tätä lähestymistapaa kutsutaan myös dynaamiseksi linkittämiseksi tai myöhäiseksi linkittämiseksi .

Toteutukset

Microsoft Windows

Dynaamisesti linkitetty kirjasto eli DLL on Microsoftin toteuttama jaetun kirjaston konsepti Microsoft Windows- ja OS/2- käyttöjärjestelmissä . Nämä kirjastot yleensä on tiedostopääte DLL , OCX(kirjastoihin sisältävien ActiveX kontrollit) tai DRV(vanhoille järjestelmä kuljettajat ). DLL-tiedostojen tiedostomuodot ovat samat kuin Windowsin EXE- tiedostoissa-eli Portable Executable (PE) 32- ja 64-bittisille Windows-järjestelmille ja New Executable (NE) 16-bittisille Windowsille. Kuten EXE -tiedostot, DLL -tiedostot voivat sisältää koodia , tietoja ja resursseja missä tahansa yhdistelmässä.

Data tiedostoja samalla tiedostomuotoa kuin DLL, mutta eri tiedostopäätteet ja mahdollisesti sisälsivät vain resurssiosa, voidaan kutsua resurssin DLL. Esimerkkejä tällaisista DLL sisältää kuvakkeen kirjastot, joskus ottaa laajentaminen ICL, ja fontti tiedostoja, joilla laajennukset FONja FOT.

Unixin kaltaiset järjestelmät, joissa käytetään ELF: ää, ja Darwin-pohjaiset järjestelmät

Useimmissa Unixin kaltaisissa järjestelmissä suurin osa konekoodista, joka muodostaa dynaamisen linkittimen, on itse asiassa ulkoinen suoritettava tiedosto, jonka käyttöjärjestelmän ydin lataa ja suorittaa ensin prosessin osoiteavaruudessa, joka on vasta rakennettu puhelun exectai posix_spawntoimintojen seurauksena. Linkin aikana käytettävän dynaamisen linkkerin polku upotetaan suoritettavaan kuvaan.

Kun suoritettava tiedosto ladataan, käyttöjärjestelmän ydin lukee siitä dynaamisen linkkerin polun ja yrittää sitten ladata ja suorittaa tämän toisen suoritettavan binäärin; jos tämä yritys epäonnistuu, koska esimerkiksi kyseisellä polulla ei ole tiedostoa, yritys suorittaa alkuperäinen suoritettava tiedosto epäonnistuu. Dynaaminen linkki lataa sitten ensimmäisen suoritettavan kuvan ja kaikki dynaamisesti linkitetyt kirjastot, joista se riippuu, ja käynnistää suoritettavan tiedoston. Tämän seurauksena dynaamisen linkkerin polun nimi on osa käyttöjärjestelmän sovelluksen binääriliitäntää .

ELF: ää käyttävät järjestelmät

Unixin kaltaisissa järjestelmissä, jotka käyttävät ELF : ää suoritettaviin kuviin ja dynaamisiin kirjastoihin, kuten Solaris , 64-bittiset HP-UX- , Linux- , FreeBSD- , NetBSD- , OpenBSD- ja DragonFly BSD -versiot , käytettävän dynaamisen linkin polku on upotettu linkin aikana .interpsuoritettavan tiedoston PT_INTERPsegmenttiin. Näissä järjestelmissä dynaamisesti ladatut jaetut kirjastot voidaan tunnistaa tiedostonimen jälkiliitteellä .so(jaettu objekti).

Dynaaminen linkkeri voidaan vaikuttaa muuttamaan sen käyttäytymistä joko ohjelman suorittamisen tai ohjelman linkityksen aikana, ja esimerkkejä tästä voidaan nähdä eri Unix-tyyppisten järjestelmien ajonaikaisen linkkerin käyttöoppaista. Tyypillinen muutos tähän käyttäytymiseen on käyttö LD_LIBRARY_PATHja LD_PRELOAD ympäristömuuttujat , jotka säätävät ajonaikaista linkitysprosessia etsimällä jaettuja kirjastoja eri paikoista ja lataamalla pakollisesti ja linkittämällä kirjastot, jotka muuten eivät olisi. Esimerkki on zlibc, joka tunnetaan myös nimellä uncompress.so, joka helpottaa läpinäkyvää purkamista, kun sitä käytetään LD_PRELOAD hakkeroinnin kautta ; näin ollen on mahdollista lukea esipakattuja (gzipped) tiedostotietoja BSD- ja Linux-järjestelmissä ikään kuin tiedostoja ei olisi pakattu, jolloin käyttäjä voi olennaisesti lisätä läpinäkyvää pakkausta taustalla olevaan tiedostojärjestelmään, vaikkakin joitakin varauksia. Mekanismi on joustava ja mahdollistaa saman koodin triviaalin muokkaamisen suorittaakseen tietojen lisä- tai vaihtoehtoisen käsittelyn tiedoston lukemisen aikana, ennen kuin mainitut tiedot toimitetaan sitä pyytäneelle käyttäjäprosessille.

macOS ja iOS

Apple Darwin -käyttöjärjestelmässä ja sen päälle rakennetuissa macOS- ja iOS- käyttöjärjestelmissä käytettävän dynaamisen linkkerin polku upotetaan linkin aikana yhteen suoritettavan kuvan Mach-O- latauskomennoista. Näissä järjestelmissä dynaamisesti ladatut jaetut kirjastot voidaan tunnistaa joko tiedostonimen jälkiliitteestä .dylibtai niiden sijoittelusta kehyksen nippuun .

Dynaaminen linkkeri ei ainoastaan ​​linkitä suoritettavaa kohdetta jaettuihin kirjastoihin, vaan myös sijoittaa konekoodifunktiot muistin tiettyihin osoitepisteisiin, joista suoritettava kohdetiedosto tietää linkin aikaan. Kun suoritettava tiedosto haluaa olla vuorovaikutuksessa dynaamisen linkkerin kanssa, se yksinkertaisesti suorittaa konekohtaisen puhelun tai hyppykäskyn johonkin näistä tunnetuista osoitepisteistä. MacOS- ja iOS -alustojen suoritettavat tiedostot ovat usein vuorovaikutuksessa dynaamisen linkkerin kanssa prosessin suorittamisen aikana; tiedetään jopa, että suoritettava tiedosto saattaa olla vuorovaikutuksessa dynaamisen linkkerin kanssa, jolloin se lataa lisää kirjastoja ja ratkaisee enemmän symboleja tuntikausia sen alkaessa. Syy siihen, että macOS- tai iOS-ohjelma on vuorovaikutuksessa dynaamisen linkkerin kanssa niin usein, johtuu sekä Applen Cocoa- ja Cocoa Touch -sovellusliittymistä ja Objective-C: stä , jolla ne toteutetaan (lisätietoja on niiden pääartikkeleissa).

Dynaaminen linkkeri voidaan pakottaa muuttamaan osaa käyttäytymisestään; toisin kuin muut Unixin kaltaiset käyttöjärjestelmät, nämä muutokset ovat kuitenkin vihjeitä, jotka dynaaminen linkki voi jättää huomiotta (ja joskus jättää huomiotta). Esimerkkejä tästä dyldon manuaalisivulla. Tyypillinen muutos tähän käyttäytymiseen on ympäristö- DYLD_FRAMEWORK_PATHja DYLD_PRINT_LIBRARIESympäristömuuttujien käyttö. Edellinen mainituista muuttujista säätää suoritettavien tiedostojen hakupolkua jaetuille kirjastoille, kun taas jälkimmäinen näyttää kirjastojen nimet, kun ne ladataan ja linkitetään.

Applen macOS-dynaaminen linkkeri on avoimen lähdekoodin projekti, joka on julkaistu osana Darwinia ja joka löytyy Applen avoimen lähdekoodin dyldprojektista.

XCOFF-pohjaiset Unix-tyyppiset järjestelmät

Unixin kaltaisissa XCOFF -käyttöjärjestelmissä , kuten AIX , dynaamisesti ladatut jaetut kirjastot käyttävät tiedostonimen jälkiliitettä .a.

Dynaaminen linkki voidaan vaikuttaa muuttamaan käyttäytymistään joko ohjelman suorittamisen tai ohjelman linkityksen aikana. Tyypillinen muunnos on tämä käyttäytyminen on käytön LIBPATH muuttujan . Tämä muuttuja säätää ajonaikaista linkitysprosessia etsimällä jaettuja kirjastoja eri paikoista ja lataamalla pakollisesti ja linkittämällä kirjastot, jotka muuten eivät olisi.

OS/360 ja sen seuraajat

Dynaaminen linkitys Assembler -kieliohjelmista IBM OS/360: ssä ja sen seuraajissa tehdään tyypillisesti käyttämällä LINK -makrokäskyä, joka sisältää Supervisor Call -käskyn, joka aktivoi käyttöjärjestelmän rutiinit, jotka tekevät kirjastomoduulin linkitettäväksi ohjelmaan. Kirjastomoduulit voivat sijaita valvontakorteissa määritellyssä "STEPLIB" - tai "JOBLIB" -muodossa ja käytettävissä vain tietylle ohjelman suoritukselle, kirjastossa, joka sisältyy PARMLIBin LINKLIST -luetteloon (määritetty järjestelmän käynnistyshetkellä) tai " linkkipakkausalue ", jossa tietyt uudelleenmoduulit ladataan järjestelmän käynnistyshetkellä.

Multics

Vuonna Multics käyttöjärjestelmän kaikki tiedostot, kuten suoritettavia ovat segmenttejä . Kutsu rutiiniin, joka ei kuulu nykyiseen segmenttiin, saa järjestelmän löytämään viitatun segmentin muistista tai levyltä ja lisää sen käynnissä olevan prosessin osoitetilaan. Dynaaminen linkitys on normaali toimintatapa, ja staattinen linkitys ( sideaineen käyttö ) on poikkeus.

Tehokkuus

Dynaaminen linkitys on yleensä hitaampaa (vaatii enemmän suoritinjaksoja) kuin linkitys kääntämisen aikana, kuten useimmat ajon aikana suoritettavat prosessit. Dynaaminen linkitys on kuitenkin usein tilaa säästävämpi (levyllä ja muistissa ajon aikana). Kun kirjasto linkitetään staattisesti, jokainen suoritettava prosessi linkitetään omaan kopioon kirjaston toiminnoista, joita pyydetään. Siksi, jos eri ohjelmat käyttävät kirjastoa monta kertaa, saman kirjaston toiminnot monistetaan useissa paikoissa järjestelmän muistissa. Jaettujen, dynaamisten kirjastojen käyttäminen tarkoittaa sitä, että sen sijaan, että jokainen tiedosto linkitettäisiin omaan kirjastokopioonsa kokoamishetkellä ja mahdollisesti tuhlaisi muistitilaa, vain yksi kirjaston kopio tallennetaan muistiin kerrallaan, mikä vapauttaa muistitilaa käytetty muualla. Lisäksi dynaamisessa linkityksessä kirjasto ladataan vain, jos sitä todella käytetään.

Katso myös

Huomautuksia

Viitteet

Lue lisää

Ulkoiset linkit