Koska Dll ovat pääosin samat kuin Entiset, jonka valinta tuottaa osana linkitys on selvyyden vuoksi, koska se on mahdollista viedä toimintoja ja tietoja joko.
Se ei ole mahdollista suoraan suorittaa DLL, koska se vaatii EXE-käyttöjärjestelmä, voit ladata sen kautta aloituskohta, joten olemassa apuohjelmia, kuten RUNDLL.EXE tai RUNDLL32.EXE, joka tarjoaa syöttöpisteen ja minimaaliset puitteet DLL: ille, jotka sisältävät tarpeeksi toimintoja suoritettavaksi ilman suurta tukea.,
Dll tarjota mekanismi jaetun koodin ja datan, jonka avulla kehittäjä jaettu koodi/data päivittää toiminnallisuutta ilman, että sovellukset voivat olla uudelleen yhteydessä tai uudelleen koottu. Sovelluksen kehityksen näkökulmasta Windows ja OS/2 voi olla ajatellut kuin kokoelma Kirjastoja, jotka on päivitetty, jolloin hakemusten yksi versio OS töihin myöhemmin, edellyttäen, että OS toimittajan on varmistettava, että liitännät ja toiminnot ovat yhteensopivia.,
suorita Dll muistia kutsuvan prosessin ja samalla käyttöoikeudet mikä tarkoittaa, että on vähän asiakkaita niiden käyttöön, mutta myös, että ei ole suojaa soittamalla EXE-jos DLL on kaikenlaista bug.
Muisti managementEdit
Windows API, DLL tiedostot ovat jaettu osiin. Jokainen jakso on oma joukko ominaisuuksia, kuten on kirjoitettava tai vain luku -, suoritettavan (koodi) tai non-executable (data), ja niin edelleen.,
koodin DLL on yleensä jaettu keskuudessa kaikki prosessit, joka käyttää DLL, joka on, ne vievät yhden paikan fyysistä muistia, ja eivät vie tilaa sivun tiedosto. Windows ei käytä kanta-riippumaton koodi sen Dll, vaan koodi käy läpi siirtäminen, koska se on ladattu, korjaus-osoitteita kaikille sen rajanylityspaikoilla paikkoihin, jotka ovat vapaata muistia ensimmäisen prosessin ladata DLL., Vanhemmissa Windows-versioissa, joissa kaikissa käynnissä olevissa prosesseissa oli yksi yhteinen osoitetila, yksi kopio DLL: n koodista riittäisi aina kaikkiin prosesseihin. Kuitenkin uudemmat versiot Windows, joka käyttää erillisiä osoiteavaruuksia kunkin ohjelman, se on vain mahdollista käyttää samaa siirretty kopio DLL useita ohjelmia, jos jokainen ohjelma on sama virtuaalinen osoitteet ilmainen mahtuu DLL-koodia., Jos jotkut ohjelmat (tai niiden yhdistelmä jo ladattu Dll) ei ole osoitteet ilmainen, sitten ylimääräinen fyysinen kopio DLL-koodi täytyy olla luotu käyttäen eri joukko siirrettiin rajanylityspaikoilla. Jos fyysinen muisti käytössä-koodin osan takaisin, sen sisältö on hävitettävä, ja myöhemmin uudelleen suoraan DLL-tiedosto tarvittaessa.
toisin kuin koodin osia, tiedot osat DLL ovat yleensä yksityisiä, eli jokainen prosessi käyttää DLL on oma kopio kaikki DLL tiedot., Valinnaisesti dataosuudet voidaan jakaa, mikä mahdollistaa prosessin välisen viestinnän tämän jaetun muistialueen kautta. Kuitenkin, koska käyttäjä rajoitukset eivät koske käyttöä jaetun DLL-muistia, tämä luo tietoturva-aukko, eli yksi prosessi voi sekoittaa jaettu tieto, joka todennäköisesti aiheuttaa kaikki muut jakamisen prosesseja käyttäytymään ei-toivotusti. Esimerkiksi vierastilin alla kulkeva prosessi voi näin turmella toisen etuoikeutetun tilin alla kulkevan prosessin. Tämä on tärkeä syy välttää jaettujen osioiden käyttöä DLL: ssä.,
Jos DLL on pakattu tiettyjä suoritettavan pakkaajien (esimerkiksi UPX), kaikki sen koodin kohdat ovat merkitty lukea ja kirjoittaa, ja on jakamaton. Luku-ja kirjoituskoodiosuudet, kuten yksityiset dataosuudet, ovat yksityisiä jokaisessa prosessissa. Näin Dll-jaettu data osat pitäisi olla pakattu, jos ne on tarkoitus käyttää samanaikaisesti useita ohjelmia, koska jokainen ohjelma oikeusasteen tuomioistuimen olisi pitänyt tehdä oma kopio DLL, mikä lisää muistin kulutusta.
Import librariesEdit
Like staattiset kirjastot, import kirjastot DLL ovat noteerattu.,lib-tiedostotunniste. Esimerkiksi kernel32.DLL, Windowsin perustoimintojen, kuten tiedostojen luomisen ja muistinhallinnan, ensisijainen dynaaminen kirjasto, on yhteydessä kernel32: n kautta.lib. Tavallinen tapa kertoa tuonti kirjastoon oikea staattinen kirjasto on koko: tuonti kirjasto on paljon pienempi, koska se sisältää vain symbolit viitaten todellinen DLL, joka käsittelee linkki-aikaa. Molemmat ovat kuitenkin Unix ar-muotoisia tiedostoja.
dynaamisiin kirjastoihin linkittäminen hoidetaan yleensä linkittämällä tuontikirjastoon, kun rakennetaan tai linkitetään suoritettavan tiedoston luomiseksi., Luotu suoritettavan sitten on tuo osoite taulukko (IAT), jonka kaikki DLL funktiokutsut viitataan (jokainen viitattu DLL-toiminto sisältää oman merkintä IAT). Ajon aikana, IAT on täynnä asianmukaiset osoitteita, jotka viittaavat suoraan toiminto erikseen ladattu DLL.
Cygwin/MSYS ja MinGW -, tuonti-kirjastot ovat perinteisesti antaneet pääte .dll.a
, jossa yhdistyvät sekä Windows DLL pääte-ja Unix-ar-pääte., Tiedostomuoto on samanlainen, mutta tuonnin merkintään käytetyt symbolit ovat erilaisia (_head_foo_dll vs _tuonti_kuvaaja_foo). Vaikka sen GNU Binutils toolchain voi luoda tuonti kirjastoja ja linkki niihin, se on nopeampi linkittää DLL suoraan. MinGW: n kokeellista työkalua nimeltä genlib voidaan käyttää luomaan import libs MSVC-tyylisillä symboleilla.
Symboli resoluutio ja bindingEdit
Jokainen toiminto viedä DLL on merkitty numeerinen järjestysluku ja mahdollisesti nimi. Samoin funktioita voidaan tuoda DLL: stä joko ordinaalilla tai nimellä., Järjestysluku edustaa asentoon, toiminto on osoitteen osoitin DLL Vienti-Osoitteen taulukko. On tavallista, että sisäiset toiminnot viedään vain ordinaalilla. Useimpien Windows API-toimintojen kohdalla vain nimet säilyvät eri Windows-julkaisuissa; ordinaalit voivat muuttua. Näin ollen ei voida luotettavasti tuoda Windows API toimintoja niiden ordinaalit.
Tuonti toiminnot, jonka järjestysluku tarjoaa vain hieman parempi suorituskyky kuin tuovan niitä nimi: vienti taulukot Dll on määräsi by nimi, joten binäärihaku voidaan käyttää etsi-toimintoa., Löydetyn nimen indeksiä käytetään tämän jälkeen ordinaalin etsimiseen Vientikoordinaalitaulukosta. 16-bittisissä ikkunoissa nimipöytää ei lajiteltu, joten nimi lookup overhead oli huomattavasti näkyvämpi.
Se on myös mahdollista sitoa suoritettavan tietyn version DLL, joka on, ratkaista osoitteet tuodaan toiminnot käännettäessä. Sidotussa tuonnissa linker säästää sen DLL: n aikaleiman ja tarkistussumman, johon tuonti on sidottu. Ajonaikaisissa Windows-tarkistuksissa katsotaan, käytetäänkö samaa versiota kirjastosta, ja jos on, Windows ohittaa tuonnin käsittelyn., Muuten, jos kirjasto on erilainen kuin mihin se oli sidottu, Windows käsittelee tuonnin normaalilla tavalla.
Sidottu ajettavat ladata hieman nopeammin, jos ne toimivat samassa ympäristössä, että he olivat koonneet, ja täsmälleen samaan aikaan, jos ne ajetaan eri ympäristössä, niin siellä ei ole haittana sitovia tuonti. Esimerkiksi kaikki standardi Windows-sovelluksia ovat sitoutuneet järjestelmän Dll niiden Windows julkaisu. Hyvä mahdollisuus sitoa sovelluksen tuonti kohdeympäristöönsä on sovelluksen asennuksen aikana., Tämä pitää kirjastot ”sidottuina” seuraavaan OS-päivitykseen asti. Se ei kuitenkaan muuta tarkistussumman suoritettavan, joten se ei ole jotain, joka voidaan tehdä kanssa allekirjoitettu ohjelmia tai ohjelmia, jotka ovat hallinnoi kokoonpanon hallinta-työkalu, joka käyttää tarkistussummat (kuten MD5-tarkistussummat) hallita tiedostojen versioita. Koska uudempia Windows-versiot ovat muuttaneet pois ottaa kiinteät osoitteet jokaiselle ladattu kirjasto (turvallisuussyistä), mahdollisuus ja arvo sitova suoritettavan vähenee.,
Selkeä run-time linkingEdit
DLL-tiedostoja voidaan erikseen ladata ajon aikana, prosessia kutsutaan yksinkertaisesti run-time dynamic linking Microsoft, käyttämällä LoadLibrary
(tai LoadLibraryEx
) API-funktiota. GetProcAddress
API-toimintoa käytetään etsiä viedään symbolit nimen, ja FreeLibrary
– purkaa DLL. Nämä toiminnot ovat analogisia dlopen
, dlsym
ja dlclose
vuonna POSIX-standardin API.,
– menettely avointa run-time linkittäminen on sama millä tahansa kielellä, joka tukee viitteitä toimintoja, koska se riippuu Windows API sijaan kielen rakenteita.
Viivästynyt loadingEdit
Normaalisti, sovellus, joka on sidoksissa vastaan DLL on tuo kirjasto ei käynnisty, jos DLL ei löydy, koska Windows ei suorita sovellus, ellei se voi löytää kaikki Dll että sovellus saattaa tarvita. Hakemus voidaan kuitenkin liittää tuontikirjastoon dynaamisen kirjaston myöhäisen lataamisen mahdollistamiseksi.,Tässä tapauksessa käyttöjärjestelmä ei yritä löytää tai ladata DLL, kun sovellus käynnistyy; sen sijaan stub on mukana sovellus, jonka linkitin, joka yrittää löytää ja ladata DLL kautta LoadLibrary ja GetProcAddress, kun yksi sen toimintoja kutsutaan. Jos DLL ei löydy, tai ladata, tai kutsutaan toiminto ei ole olemassa, sovellus luo poikkeus, joka voi olla kiinni ja käsitellä asianmukaisesti. Jos sovellus ei käsittele poikkeusta lukuun ottamatta, se on kiinni käyttöjärjestelmä, joka lopettaa ohjelman kanssa virheilmoitus.,
viive -, lastaus-mekanismi antaa myös ilmoituksen koukkuja, joiden avulla sovellus suorittaa ylimääräisiä käsittelyä tai virheiden käsittelyä, kun DLL ladataan ja/tai DLL-toiminto on nimeltään.
Vastaa