DLL hellA DLL-hell (DLL pokol) egy színes kifejezés arra a helyzetre, amikor a Windows operációs rendszer képtelen helyesen kezelni a telepített DLL-eket (dinamikus linkelésű könyvtárakat).[1] Az általánosabb verziópokol speciális esete. Ennek több oka is lehet:
ProblémákA DLL-ek lényege, hogy több program is használhatja ugyanazokat az eljárásokat, így memóriát és lemezterületet takarítva meg, valamint a programok készítése is egyszerűsödik, mivel ugyanazt a rutineljárást csak egyszer kell elkészíteni. A statikus könyvtárakat az egyes programok tartalmazzák, így növelik azok méretét. Azonban, ha egy új program úgy telepít egy DLL-t, hogy felülírja annak régebbi változatát, ez eredményezheti, hogy régebb telepített programok (amelyek a régi DLL-t használták) többet nem fognak futni, vagy hibásan működnek. A DLL-ekbe nincs beépítve a visszafelé kompatibilitás. Emiatt még a kisebb változások miatt is olyan DLL fordulhat, melynek belső szerkezete annyira különbözik az előzőektől, hogy a korábbi verziókat használó programok összeomlanak. A statikus könyvtárakkal nincs ilyen probléma, mivel azok együtt vannak a program többi részével, egy egységben. A DLL-ek szerkezetének változása azért olyan fontos, mivel a kliens programok a bennük található adattípusokat, függvényeket és eljárásokat aszerint hivatkozzák, hogy hányadikként szerepelnek a DLL-ekben. Okozhatja a káoszt az is, ha egy alkalmazás nem törli le a csak általa használt DLL-t, mikor a rendszerből eltávolítják. Konfliktusba kerülhetnek különböző verziók vagy nehéz lehet megszerezni a szükséges DLL-eket. Extrém esetben ez az operációs rendszer teljes összeomlását is eredményezheti: a Microsoft Windows rendszerekben ez kék halálként ismeretes. A Microsoft már előzetesen megpróbált megoldást találni. A .Net keretrendszerben az assemblyk nyújtanak lehetséges alternatívát. ÖsszeférhetetlenségEgy DLL adott verziója megfelelő lehet egyes programok számára, míg mások számára nem. A Windows is sebezhetővé vált, mivel támogatta a dinamikus linkelést a C++ könyvtárak és az Object Linking and Embedding (OLE) objektumok között. A C++ osztályok exportálják metódusaikat, de például már az is inkompatibilitást okozhat, hogy hozzáadnak egy új metódust vagy virtuálissá tehetnek egy már létezőt. Ezt az Object Linking and Embedding megpróbálja úgy kivédeni, hogy az interfészeknek stabilnak kell maradniuk, és a memóriakezelők nem közösek. Ez azonban nem elégséges, mivel a szemantika is változhat. Egy alkalmazás javítása okozhatja azt, hogy egy másikban elvész egy képesség. A Windows 2000 előtti Windowsok sebezhetőségét okozta, hogy közösek voltak a COM osztálytáblák a felhasználók és a folyamatok között. Egy DLL/EXE csak egy COM-ot definiálhatott; ha egy programnak szüksége volt ennek egy példányára, akkor mindig csak a központit kaphatta. Emiatt, ha egy új program a DLL új verzióját telepítette, azzal használhatatlanná tehette a gépen már meglevő programokat. Régebbi verziókNemcsak az újabb, hanem a korábbi verziók is okozhatnak problémát. A Windows 3.1-ben gyakori probléma volt a ctl3d.dll és a ctl3dv2.dll felülírása. Ezeket a Microsoft hozta létre, de a telepített programok nem az aktuális, hanem a korábbi verziókkal érkeztek, és írták felül.[2] Okai:
Inkorrekt COM regisztrációA side-by-side assemblyk előtt a Registry döntött arról, hogy melyik DLL-t kell használni.[5] Ha a modul egy másik verziója van regisztrálva, akkor az fog betöltődni, és nem az, amit a felhasználó elvár. Okozhatják ütköző telepítések, amelyek ugyanabba a könyvtárba települnek; ekkor az utolsó telepítés verziója érvényes. Megosztott modulok a memóriábanA 16 bites Windowsok (és a Windows on Windows) egy adott DLL egy példányát töltik be. Minden alkalmazás ezt használja. Ha már nincs rá szükség, akkor törlődik a memóriából. A többi (32 illetve 64 bites) Windowson csak akkor osztoznak programok egy példányon, ha ugyanazt a megosztott DLL-t töltötték be. Így, ha egy program már betöltötte a modult egy másik könyvtárban, akkor nem indítható egy másik program, ami egy ezzel összeférhetetlen verziót használ. Ehhez előbb az összes, az ütköző verziót használó programot be kell zárni, és utána ezt elindítani. Előfordulhat, hogy ezután a másik program újra elindítható; így a probléma csak akkor jelentkezik, ha nem a megfelelő sorrendbe indították az alkalmazásokat. HasználhatóságHa egy DLL frissítése nem rontja el az összes programot, ami használja, akkor nehezebb a DLL verziójával kapcsolatos problémákat kezelni. A biztonsági frissítések sürgető és fájdalmas esetek. Ahelyett, hogy csak a legújabb verziót vizsgálná, minden korábbi verziót is tesztelni kell összeférhetőség szempontjából. OkaiA DLL-ek között konfliktust okozhatnak a következők:
A Windows NT előtti verziókban gyakori jelenség volt a DLL-pokol. Ez főként amiatt volt, hogy a 16 bites Windowsok nem különítették el az egyes alkalmazások által használt memóriát, emiatt nem tölthették be saját verziójukat az osztott könyvtárra. A telepítőktől elvárták, hogy verifikálják DLL-információjukat, mielőtt felülírják a rendszer DLL-eket. A Microsoft és mások különböző eszközöket adtak a fejlesztések megkönnyítésére, amelyek magukkal vitték a rendszer DLL-eket. A terjesztőknek szabvány telepítőt kellett használniuk, aminek megfelelően kellett működnie, mielőtt megkapták a Microsoft logót. A jó polgár megközelítés nem segítette a probléma kezelését, mivel az Internet terjedése miatt számos más programot lehetett letölteni és telepíteni, amelyek nem feltétlenül viselkedtek jó polgár módjára. A problémák nagy része még azóta is fennáll, amit kihasználnak a kártevők készítői is. Ez további sebezhetőséget jelent, ami érint minden programterjesztőt, aki Windowsra ad ki programokat, köztük a Microsoftot is.[6] MegoldásokA probléma kezelésére számos megoldást gondoltak ki. Statikus linkelésA statikus linkelés megkerüli a problémát azzal, hogy egyáltalán nem használ dinamikus linkelést.[7] C/C++ alkalmazásoknál gyakori, hogy ahelyett, hogy amiatt kellene aggódni, hogy milyen verziója van telepítve például a Windows File ProtectionA DLL felülírási problémát mérsékli a Windows File Protection,[8] amit a Windows 2000-ben vezették be.[9] Ez megelőzi, hogy nem igazolt alkalmazások felülírjanak rendszer DLL-ek, hacsak nem használnak bizonyos meghatározott Windows API-t, ami ezt megengedi. Továbbra is fennáll az a kockázat, hogy a Microsoft frissítések összeférhetetlenek egyes alkalmazásokkal, de ezt a kockázatot csökkenti a side-by-side assemblyk használata. Más telepítők nem írhatják felül a rendszer DLL-eket, hacsak nem kötik be a Windows updatert is. Lehetséges még a Windows File Protection letiltása, vagy a Windows Vistától kezdődően a fájlrendszer birtokba vétele és saját maguk feljogosítása. Ezeket a változásokat azonban a SFC vissza tudja állítani. Több DLL párhuzamos használataEbben a megközelítésben az ütközéseket úgy oldják fel, hogy a vitatott DLL-ből egy vagy több program saját verziót tart. Kézi megoldásként a 32 és 64 bites programoknál megtehető, hogy a megfelelő DLL-t a program mappájába másoljuk. Ekkor a program el tud indulni más programok előtt és után is. 16 bites programok esetén ez nem tehető meg, csak különböző virtuális gépek használatával. A Windows 98 SE/2000 előtt ezt az OLE felügyelte, így egyszerre egy DLL-nek egy verziója lehetett betöltve. A Windows 98 SE/2000 bevezette a side-by-side assembly lehetőségét.[10] Ez képes több különböző verziójú DLL-t betölteni, lehetővé téve, hogy az ugyanazt a DLL-t betöltő programok továbbra is ugyanazokat az objektumokat használják, így memóriát takarítva meg.[11] Hátránya, hogy az árva DLL-eket nem fogja karban tartani az automatikus folyamatok. Hordozható alkalmazásokFutásidejű környezettől és architektúrától függően, a hordozható alkalmazások csökkenthetik a DLL által okozott problémákat azzal, hogy a program egy csomagban tartalmazza a DLL-eket is.[9] Ekkor a program nem minősíti a teljes elérési utat, hanem arra a mechanizmusra hagyatkozik, ami először helyben keresi a szükséges adatokat és programokat.[12] Azonban ezt is kihasználhatják rosszindulatú programok.[13] A nagyobb rugalmasság ára a biztonság romlása, ha a magán DLL-ek nem kapnak biztonsági frissítéseket. Az alkalmazásvirtualizáció lehetővé teszi, hogy minden alkalmazás a saját kis világában fusson, így ne férhessen hozzá közvetlenül a fájlrendszerben levő fájlokhoz. További ellenintézkedések
Hasonló problémák más operációs rendszerek alattA "DLL hell", magyarul "DLL pokol" szakkifejezés definíció szerint kizárólag Windows operációs rendszerre vonatkozhat, mivel a több processz által is használható megosztott eljáráskönyvtárakat egyedül itt hívják DLL-nek, ugyanis eredetileg ez a kiterjesztés tartozott hozzájuk. Ugyanakkor megosztott eljáráskönyvtárak minden modernebb operációs rendszerben előfordulnak, csak a nevük más. Például Linux/Unix rendszerekben shared lib a nevük. A "DLL hell" probléma megfelelője elvileg velük kapcsolatban is előállhat, ám a ma használatos Linux rendszerek esetén több tényező is gátat vet neki:
Jegyzetek
Források
FordításEz a szócikk részben vagy egészben a DLL Hell című angol Wikipédia-szócikk 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. |
Portal di Ensiklopedia Dunia