Od Dll jsou v podstatě stejné jako Ex, volba, která produkují jako součást procesu propojení je pro přehlednost, protože je možné exportovat funkce a data z obou.
není možné přímo spustit DLL, protože to vyžaduje EXE pro operační systém načíst přes vstupní bod, tedy existence utilit, jako je RUNDLL.EXE nebo RUNDLL32.EXE, které poskytují vstupní bod a minimální rámec pro DLL, které obsahují dostatek funkcí k provedení bez velké podpory.,
knihovny Dll, poskytují mechanismus pro sdílení kódu a dat, což umožňuje developer sdíleného kódu/dat upgrade funkčnost bez nutnosti aplikací, které mají být re-spojený, nebo re-zkompilovaný. Z aplikace rozvojového hlediska, Windows a OS/2 může být myšlenka jako soubor knihovny Dll, které jsou inovovány, což umožňuje aplikacím pro jednu verzi OS pro práci v později, za předpokladu, že OS má dodavatel zajištěno, že rozhraní a funkce jsou kompatibilní.,
spustit Dll v paměťovém prostoru volajícího procesu a stejná přístupová oprávnění, což znamená, že tam je málo režijní náklady v jejich použití, ale také to, že neexistuje žádná ochrana pro volání EXE li DLL má nějakou chybu.
memory managementEdit
v systému Windows API jsou soubory DLL uspořádány do sekcí. Každá sekce má svůj vlastní soubor atributů, jako je zapisovatelný nebo pouze pro čtení, spustitelný (pro kód) nebo nespustitelný (pro data) atd.,
kód v DLL je obvykle sdílena mezi všechny procesy, které používají DLL; to znamená, že obsadit jediné místo ve fyzické paměti, a nezabírají místo na stránce soubor. Windows nepoužívá kód nezávislý na pozici pro své knihovny Dll; místo toho kód prochází přemístění, jak je naloženo, kterým adresy pro všechny jeho vstupní body v místech, která jsou zdarma v paměti první proces pro načtení knihovny DLL., Ve starších verzích systému Windows, ve kterých všechny spuštěné procesy zabíraly jediný společný adresní prostor, by pro všechny procesy vždy stačila jedna kopie kódu DLL. Nicméně, v novějších verzích systému Windows, které používají oddělené adresní prostory pro každý program, je pouze možné použít stejné přemístěna kopii knihovny DLL, ve více programech, pokud každý program má stejné virtuální adresy zdarma ubytovat DLL je kód., Pokud některé programy (nebo jejich kombinace již načten Dll) nemají tyto adresy zdarma, pak další fyzickou kopii DLL je kód bude muset být vytvořen pomocí jinou sadu přemístěna vstupní body. Pokud má být fyzická paměť obsazená sekcí kódu regenerována, její obsah je zlikvidován a podle potřeby znovu načten přímo ze souboru DLL.
Na rozdíl od sekcí kódu jsou datové sekce DLL obvykle soukromé; to znamená, že každý proces používající DLL má svou vlastní kopii všech dat DLL., Volitelně lze sdílet datové sekce, což umožňuje komunikaci mezi procesy prostřednictvím této sdílené oblasti paměti. Protože se však uživatelská omezení nevztahují na používání sdílené paměti DLL, vytvoří se tím bezpečnostní díra; konkrétně jeden proces může poškodit sdílená data, což pravděpodobně způsobí, že se všechny ostatní procesy sdílení budou chovat nežádoucím způsobem. Například proces běžící pod účtem hosta může tímto způsobem poškodit jiný proces běžící pod privilegovaným účtem. To je důležitý důvod, proč se vyhnout používání sdílených sekcí v DLL.,
Pokud je DLL komprimován určitými spustitelnými baliči (např. Sekce kódu pro čtení a zápis, podobně jako sekce soukromých dat, jsou pro každý proces soukromé. DLL se sdílenými datovými sekcemi by tedy neměly být komprimovány, pokud mají být použity současně více programy, protože každá instance programu by musela mít vlastní kopii DLL, což by mělo za následek zvýšenou spotřebu paměti.
import knihovenedit
jako statické knihovny, import knihoven pro DLL jsou zaznamenány .,přípona lib souboru. Například kernel32.dll, primární dynamická knihovna pro základní funkce systému Windows, jako je vytváření souborů a správa paměti, je propojena přes kernel32.LIBA. Obvyklý způsob, jak říct, import knihovny z řádné statické knihovny je podle velikosti: import knihovny je mnohem menší, protože obsahuje pouze symboly odkazující na skutečné DLL, které mají být zpracovány na link-time. Oba přesto jsou soubory formátu Unix ar.
propojení s dynamickými knihovnami je obvykle řešeno propojením s importní knihovnou při vytváření nebo propojení pro vytvoření spustitelného souboru., Vytvořený spustitelný soubor pak obsahuje tabulku adres importu (IAT), na kterou jsou odkazována všechna volání funkcí DLL (každá odkazovaná funkce DLL obsahuje svůj vlastní záznam v IAT). Při běhu je IAT vyplněn vhodnými adresami, které ukazují přímo na funkci v Samostatně načtené DLL.
V Cygwin/MSYS a MinGW, import knihovny jsou obvykle dána přípona .dll.a
, který kombinuje obě Okna DLL přípony a Unix ar přípony., Formát souboru je podobný, ale symboly používané k označení importu jsou různé (_head_foo_dll vs __IMPORT_DESCRIPTOR_foo). Ačkoli jeho GNU Binutils toolchain může generovat import knihoven a odkaz na ně, je rychlejší odkaz na DLL přímo. Experimentální nástroj v MinGW s názvem genlib může být použit pro generování import libs se symboly ve stylu MSVC.
rozlišení symbolů a bindingEdit
každá funkce exportovaná DLL je identifikována číselným pořadovým číslem a volitelně názvem. Podobně lze funkce importovat z DLL buď pořadovým číslem nebo jménem., Pořadové číslo představuje pozici ukazatele adresy funkce v tabulce adres DLL exportu. Je běžné, že interní funkce se exportují pouze pořadovým číslem. Pro většinu funkcí Windows API jsou zachovány pouze názvy v různých verzích systému Windows; ordinály se mohou změnit. Nelze tedy spolehlivě importovat funkce API systému Windows jejich ordinály.
Import funkce pořadové poskytuje pouze mírně lepší výkon než import je podle jména: export tabulky Dll jsou seřazeny podle názvu, takže binární vyhledávání může být použit k nalezení funkce., Index nalezeného jména se pak používá k vyhledání pořadového čísla v exportní pořadové tabulce. V 16bitových oknech nebyla jmenná tabulka seřazena, takže název vyhledávání nad hlavou byl mnohem znatelnější.
je také možné vázat spustitelný soubor na konkrétní verzi DLL,tj. U vázaných dovozů linker uloží časové razítko a kontrolní součet DLL, ke kterému je dovoz vázán. Při spuštění systému Windows zkontroluje, zda se používá stejná verze knihovny, a pokud ano, systém Windows obchází zpracování importu., V opačném případě, pokud se Knihovna liší od knihovny, ke které byla vázána, systém Windows zpracovává import normálním způsobem.
Vázán spustitelné zatížení poněkud rychleji, pokud jsou spuštěny ve stejném prostředí, které byly sestaveny pro, a přesně stejnou dobu, pokud jsou provozovány v jiném prostředí, takže není nevýhodou pro vazbu dovozu. Například všechny standardní aplikace Windows jsou vázány na systémové knihovny DLL příslušného vydání systému Windows. Dobrá příležitost vázat dovoz aplikace na její cílové prostředí je během instalace aplikace., To udržuje knihovny „vázané“ až do příští aktualizace operačního systému. To dělá, nicméně, změnit kontrolní součet spustitelného souboru, takže to není něco, co lze udělat s podepsanou programy nebo programy, které jsou spravovány konfigurační nástroj pro správu, který používá kontrolních součtů (jako MD5 kontrolní součty), aby spravovat verze souborů. Jako novější verze Windows se pohybovali pryč od nutnosti pevné adresy pro každé načtené knihovny (z bezpečnostních důvodů), možnost a hodnotu vazby spustitelný klesá.,
Explicitní run-time linkingEdit
soubory DLL může být explicitně načteny při spuštění, proces, odkazoval se na jednoduše jako run-time dynamic linking společností Microsoft, pomocí LoadLibrary
(nebo LoadLibraryEx
) API funkce. FunkceGetProcAddress
API slouží k vyhledání exportovaných symbolů podle názvu a FreeLibrary
– k uvolnění DLL. Tyto funkce jsou analogické dlopen
, dlsym
a dlclose
ve standardním API POSIX.,
postup pro explicitní run-time propojení je stejné v jakémkoli jazyce, který podporuje ukazatele na funkce, protože to závisí na Windows API, spíše než jazykové konstrukty.
zpožděné načítáníedit
obvykle se aplikace, která je propojena s knihovnou importu DLL, nespustí, pokud DLL nelze najít, protože Windows nespustí aplikaci, pokud nenajde všechny DLL, které aplikace může potřebovat. Aplikace však může být propojena s importní knihovnou, aby bylo možné zpožděné načítání dynamické knihovny.,V tomto případě operační systém, nebude se snažit najít nebo načíst knihovnu DLL při spuštění aplikace; místo toho, pahýl je zahrnuta v žádosti linker, který se bude snažit najít a načíst DLL prostřednictvím LoadLibrary a GetProcAddress, když jeden z jeho funkce se nazývá. Pokud DLL nelze najít nebo načíst nebo volaná funkce neexistuje, aplikace vygeneruje výjimku, která může být zachycena a vhodně zpracována. Pokud aplikace výjimku nezpracovává, bude zachycena operačním systémem, který program ukončí chybovou zprávou.,
mechanismus zpoždění načítání také poskytuje oznamovací háčky, což umožňuje aplikaci provádět další zpracování nebo zpracování chyb při načtení DLL a/nebo je volána jakákoli funkce DLL.
Napsat komentář