Mivel a Dll-ek lényegében ugyanaz, mint Exek, a választás, amely előállítani, mint része az összekötő folyamat tisztaságát, mivel lehetséges, hogy az export funkciót, illetve adatok vagy.
nem lehetséges közvetlenül végrehajtani a DLL-t, mivel EXE-t igényel az operációs rendszer számára, hogy betöltse azt egy belépési ponton, így olyan segédprogramok léteznek, mint a RUNDLL.EXE vagy RUNDLL32.EXE, amely biztosítja a belépési pont és minimális keretet DLL-ek, amelyek elegendő funkcionalitást, hogy végre anélkül, hogy sok támogatást.,
Dll-ek mechanizmust biztosítanak a közös kódot, majd az adatokat, lehetővé téve, hogy a fejlesztő a közös kód/adatok frissítési funkciót, anélkül, hogy az alkalmazásokat újra-kapcsolódó vagy újra össze. Az alkalmazásfejlesztési szempontból a Windows és az OS/2 a frissített DLL-ek gyűjteményének tekinthető, amely lehetővé teszi az operációs rendszer egyik verziójának alkalmazásainak későbbi működését, feltéve, hogy az operációs rendszer szállítója biztosította az interfészek és a funkcionalitás összeegyeztethetőségét.,
a DLL-ek a hívási folyamat memóriaterületében és azonos hozzáférési jogosultságokkal működnek, ami azt jelenti, hogy használatuk során kevés a rezsi, de azt is, hogy nincs védelem a hívó EXE számára, ha a DLL-nek bármilyen hibája van.
Memory managementEdit
A Windows API-ban a DLL fájlok szakaszokra vannak rendezve. Minden szakasznak saját attribútumkészlete van, például írható vagy csak olvasható, végrehajtható (kódhoz) vagy nem végrehajtható (adatokhoz) stb.,
a DLL kódja általában a DLL-t használó folyamatok között oszlik meg; vagyis egyetlen helyet foglalnak el a fizikai memóriában, és nem foglalnak helyet az oldalfájlban. A Windows nem használ pozíciófüggetlen kódot a DLL-ekhez; ehelyett a kód betöltésekor áthelyeződik, rögzítve az összes belépési pont címét olyan helyeken, amelyek szabadon vannak az első folyamat memóriaterületében, hogy betöltsék a DLL-t., A Windows régebbi verzióiban, amelyekben az összes futó folyamat egyetlen közös címteret foglalt el, a DLL kódjának egyetlen példánya mindig elegendő lenne az összes folyamathoz. Azonban a Windows újabb verzióiban, amelyek minden programhoz külön címtereket használnak, csak akkor lehet ugyanazt a DLL áthelyezett példányát használni több programban, ha minden program ugyanolyan virtuális címekkel rendelkezik, amelyek szabadon elhelyezhetik a DLL kódját., Ha egyes programok (vagy a már betöltött DLL-ek kombinációja) nem rendelkeznek ingyenes címekkel, akkor a DLL kódjának további fizikai másolatát kell létrehozni, egy másik áthelyezett belépési pontkészlet használatával. Ha a kódszakasz által elfoglalt fizikai memóriát vissza kell állítani, annak tartalmát el kell dobni, majd szükség esetén közvetlenül újratölteni a DLL fájlból.
a kódszakaszokkal ellentétben a DLL adatszakaszai általában privátak; vagyis a DLL-t használó minden folyamatnak saját másolata van az összes DLL adatról., Opcionálisan az adatszakaszok megoszthatók, lehetővé téve a folyamatok közötti kommunikációt ezen a megosztott memóriaterületen keresztül. Mivel azonban a felhasználói korlátozások nem vonatkoznak a megosztott DLL memória használatára, ez biztonsági lyukat hoz létre; nevezetesen, egy folyamat megrongálhatja a megosztott adatokat, ami valószínűleg az összes többi megosztási folyamat nemkívánatos viselkedéséhez vezet. Például egy vendégfiók alatt futó folyamat ily módon megronthat egy másik folyamatot, amely egy kiváltságos fiók alatt fut. Ez fontos oka annak, hogy elkerüljük a megosztott szakaszok használatát a Dll-ekben.,
Ha egy DLL-t bizonyos végrehajtható csomagolók tömörítenek (pl. UPX), akkor az összes kódrészlete olvasható és írható, és nem lesz megosztva. Az írás-olvasás kódszakaszok, hasonlóan a privát adatszakaszokhoz, minden folyamat számára privátak. Így Dll-ek közös adatok szakaszok nem kell tömörített, ha azok célja, hogy használható egyszerre több program, mivel minden program például az volna, hogy készítsen saját példányát a DLL, ami fokozott memória-felhasználás.
Import librariesEdit
mint a statikus könyvtárak, import könyvtárak DLL-ek jegyezni a .,lib fájl kiterjesztés. Például kernel32.a Dll, A Windows alapfunkcióinak elsődleges dinamikus Könyvtára, mint például a fájl létrehozása és a memória kezelése, kernel32-en keresztül kapcsolódik.lib. A szokásos módja annak, hogy elmondja egy import könyvtár megfelelő statikus könyvtár mérete: az import könyvtár sokkal kisebb, mivel csak szimbólumokat tartalmaz utalva a tényleges DLL, feldolgozandó link-idő. Mindkettő azonban Unix ar formátumú fájlok.
a dinamikus könyvtárakhoz való kapcsolódást általában úgy kezelik, hogy egy importkönyvtárhoz kapcsolnak, amikor létrehoznak vagy összekapcsolnak egy végrehajtható fájlt., A létrehozott futtatható fájl ezután tartalmaz egy Import címtáblát (IAT), amellyel az összes DLL függvényhívásra hivatkoznak (minden hivatkozott DLL függvény tartalmazza saját bejegyzését az IAT-ban). Futásidőben az IAT tele van megfelelő címekkel, amelyek közvetlenül a külön betöltött DLL függvényére mutatnak.
a Cygwin / MSYS és MinGW könyvtárban az import könyvtárak általában a .dll.a
utótagot kapják, amely mind a Windows DLL utótagot, mind a Unix ar utótagot egyesíti., A fájl formátuma hasonló, de a szimbólumok jelölésére használt import különböző (_head_foo_dl vs _ _ IMPORT _ DESCRIPTOR_foo). Bár a GNU Binutils toolchain képes import könyvtárakat létrehozni és hozzájuk kapcsolódni, gyorsabb közvetlenül a DLL-hez kapcsolódni. Egy kísérleti eszköz MinGW nevű genlib lehet használni, hogy létrehoz import libs MSVC-stílusú szimbólumok.
Szimbólumfelbontás és bindingEdit
a DLL által exportált függvényeket egy numerikus ordinális és opcionálisan egy név határozza meg. Hasonlóképpen, a funkciók DLL-ből importálhatók ordinális vagy név szerint., A sor a függvény címmutatójának helyzetét jelöli a Dll Export Címtáblában. Gyakori, hogy a belső funkciókat csak ordinal exportálja. A legtöbb Windows API funkció esetében csak a nevek maradnak meg a különböző Windows kiadásokban; az ordinálok változhatnak. Így nem lehet megbízhatóan importálni a Windows API funkciókat az ordinals által.
a funkciók ordinális importálása csak kissé jobb teljesítményt nyújt, mint a név szerinti importálás: a DLL-ek exporttáblázatait név szerint rendelik, így egy bináris keresés használható egy funkció megtalálására., A megtalált név indexét ezután az exportált ordinális táblázat sorrendjének megkeresésére használják. A 16 bites Windowsban a névtáblát nem válogatták, így a névkeresés sokkal észrevehetőbb volt.
az is lehetséges, hogy egy végrehajtható fájlt egy DLL adott verziójához kötünk, vagyis az importált funkciók címeinek fordításkor történő megoldására. A kötött import esetében a linker megmenti annak a DLL-nek az időbélyeg-és ellenőrző összegét, amelyre az import vonatkozik. Futási időben a Windows ellenőrzi, hogy a könyvtár ugyanazt a verzióját használja-e, ha igen, a Windows megkerüli az import feldolgozását., Ellenkező esetben, ha a könyvtár eltér a kötelezetttől, A Windows az importot normál módon dolgozza fel.
A kötött végrehajtható fájlok valamivel gyorsabban töltődnek be, ha ugyanabban a környezetben futnak, amelyre összeállították őket, és pontosan ugyanabban az időben, ha más környezetben futnak, tehát nincs hátrány az import kötéséhez. Például az összes szabványos Windows-alkalmazás kötődik a megfelelő Windows-kiadás rendszer DLL-jéhez. Az alkalmazás telepítése során jó lehetőség arra, hogy az alkalmazás importját a célkörnyezetéhez kösse., Ez tartja a könyvtárak “kötött”, amíg a következő operációs rendszer frissítése. Ez azonban megváltoztatja a végrehajtható fájl ellenőrző összegét, így nem lehet aláírt programokkal vagy olyan programokkal elvégezni, amelyeket egy konfigurációs kezelő eszköz kezel, amely ellenőrző összegeket (például MD5 ellenőrző összegeket) használ a fájlverziók kezeléséhez. Mivel a legújabb Windows verziók eltávolodtak attól, hogy minden betöltött könyvtárhoz rögzített címek legyenek (biztonsági okokból), a végrehajtható fájl kötésének lehetősége és értéke csökken.,
Explicit run-time linkingEdit
a DLL fájlok kifejezetten betölthetők futásidőben, a Microsoft által egyszerűen futásidejű dinamikus összekapcsolásnak nevezett folyamat, a LoadLibrary
(vagy LoadLibraryEx
) API funkció használatával. AGetProcAddress
API függvény az exportált szimbólumok név szerinti megkeresésére szolgál, ésFreeLibrary
– a DLL kiürítéséhez. Ezek a funkciók analógok adlopen
,dlsym
, ésdlclose
a POSIX standard API-ban.,
az explicit futási idő összekapcsolásának eljárása minden olyan nyelven megegyezik, amely támogatja a funkciók mutatóit, mivel ez a Windows API-tól függ, nem pedig a nyelvi konstrukcióktól.
késleltetett betöltésedit
általában egy DLL importkönyvtárához kapcsolódó alkalmazás nem indul el, ha a DLL nem található, mert a Windows nem futtatja az alkalmazást, kivéve, ha megtalálja az összes olyan DLL-t, amelyre az alkalmazásnak szüksége lehet. Azonban egy alkalmazás összekapcsolható egy importkönyvtárral, hogy lehetővé tegye a dinamikus könyvtár késleltetett betöltését.,Ebben az esetben az operációs rendszer nem próbálja megtalálni vagy terhelést a DLL amikor az alkalmazás elindul; ehelyett a jegy tartalmazza az alkalmazás által a linker, amely megpróbálja megkeresni terhelés a DLL-t hiba a loadlibrary, valamint GetProcAddress, amikor az egyik feladatai hívják. Ha a DLL nem található vagy tölthető be, vagy a hívott funkció nem létezik, az alkalmazás kivételt generál, amelyet megfelelően lehet elkapni és kezelni. Ha az alkalmazás nem kezeli a kivételt, akkor az operációs rendszer elkapja, amely hibaüzenettel megszünteti a programot.,
a késleltetett betöltési mechanizmus értesítési horgokat is biztosít, lehetővé téve az alkalmazás számára, hogy további feldolgozást vagy hibakezelést hajtson végre a DLL betöltésekor és/vagy bármilyen DLL funkció hívásakor.
Vélemény, hozzászólás?