Siden Filene er i hovedsak de samme som EXEs, valg av som for å produsere som en del av tilkoblingsprosessen er for klarhet, siden det er mulig å eksportere funksjoner og data fra begge.
Det er ikke mulig å direkte utfører en DLL, siden det krever en EXE for operativsystemet for å laste det gjennom et inngangspunkt, derfor er eksistensen av verktøy som RUNDLL.EXE-eller RUNDLL32.EXE som gir inngangspunkt og minimal ramme for Dll-filer som inneholder nok funksjonalitet til å utføre uten mye støtte.,
Dll gir en mekanisme for felles kode og data, slik at en utvikler av felles kode/data til å oppgradere funksjonalitet uten å kreve programmer for å bli re-tilknyttet, eller re-samlet. Fra programmet utvikling synspunkt Windows og OS/2 kan sees på som en samling av Dll-filer som er oppgradert, slik at programmer for en versjon av OS-et til å jobbe i en nyere en, forutsatt at OS leverandøren har sørget for at grensesnitt og funksjonalitet er kompatible.,
Dll-filer utfør i minne kall prosess og med samme rettigheter som betyr at det er lite overhead i sitt bruk, men også at det er ingen beskyttelse for telefoni EXE hvis DLL-har noen form for feil.
Minne managementEdit
I Windows API DLL-filene er organisert i seksjoner. Hver del har sitt eget sett av attributter, som for eksempel å være skrivbar eller skrivebeskyttet, kjørbar fil (for-kode) eller ikke-kjørbar (etter data), og så videre.,
– koden i en DLL-filen er vanligvis delt mellom alle prosessene som bruker den DLL, det vil si at de opptar et enkelt sted i fysisk minne, og ikke tar opp plass i side-fil. Windows bruker ikke stilling-uavhengig koden for sin Dll-filer; i stedet koden gjennomgår flytting som den er lastet, fikse-adresser for alle sine oppføring poeng på steder som er gratis i minnet av den første prosessen for å laste DLL-filen., I eldre versjoner av Windows, som alle prosesser som kjører okkupert av en felles adresseområde, en enkelt kopi av DLL-koden for alltid ville være tilstrekkelig for alle prosesser. Men i nyere versjoner av Windows som bruker egen adresse mellomrom for hvert program, det er bare mulig å bruke det samme flyttet kopi av DLL-filen i flere programmer om hvert program har den samme virtuelle adresser gratis å imøtekomme DLL-kode., Hvis noen programmer (eller deres kombinasjon av allerede lagt Dll-filer) som ikke har disse adressene gratis, deretter en ekstra fysisk kopi av DLL-koden må være opprettet, ved hjelp av et annet sett av flyttet startpunkter. Hvis det fysiske minnet som brukes av en kode delen er å bli gjenvunnet, innholdet er forkastet, og senere på nytt direkte fra DLL-filen som er nødvendig.
I motsetning til koden seksjoner, data deler av en DLL-fil er vanligvis privat; det vil si at hver prosess ved bruk av DLL-filen har sin egen kopi av alle DLL-filen data., Alternativt, data seksjoner kan gjøres felles, slik at inter-prosess kommunikasjon via denne felles minne området. Imidlertid, fordi brukeren begrensningene gjelder ikke bruk av felles DLL-minne, skaper dette et sikkerhetshull; nemlig en prosess som kan ødelegge den delte data, som trolig vil føre til at alle andre deler prosesser for å oppføre seg undesirably. For eksempel, en prosess som kjører under en gjest-kontoen din, kan på denne måten skadet en annen prosess som kjører under en privilegert konto. Dette er en viktig grunn til å unngå bruk av felles seksjoner i Dll-filer.,
Hvis en DLL-filen er komprimert ved visse kjørbare packers (f.eks. UPX), alle av koden avsnitt er merket som kan lese og skrive, og vil være unshared. Lese-og-skrive-koden avsnitt, mye som private data seksjoner, er private til hver prosess. Dermed Dll-filer med felles data seksjoner bør ikke være komprimert hvis de er ment å brukes samtidig av flere programmer, siden hvert program eksempel ville ha til å bære sin egen kopi av DLL-filen, noe som resulterer i økt minne.
Importer librariesEdit
Som statisk bibliotek, import bibliotek for Dll-filer er bemerket av .,lib file extension. For eksempel, kernel32.dll, det primære dynamisk bibliotek for Windows » – base-funksjoner som fil, oppretting og minne ledelse, som er knyttet sammen via kernel32.lib. Den vanlige måten å fortelle en import-biblioteket fra en skikkelig statisk bibliotek er av størrelse: import biblioteket er mye mindre som bare inneholder symboler henviser til den faktiske DLL, til å bli behandlet på en link-tid. Både likevel er Unix-ar-format filer.
koble til dynamiske biblioteker er vanligvis håndteres ved å koble til en import-biblioteket når bygningen eller linking til å opprette en kjørbar fil., Opprettet den kjørbare da inneholder en import-adresse tabell (IAT) som alle DLL-funksjon samtaler, er det refereres til (hvert refererte DLL-funksjonen inneholder sin egen oppføring i IAT). Ved run-time, IAT er fylt med aktuelle adresser som peker direkte til en funksjon i separat lagt DLL.
I Cygwin/MSYS og MinGW, import biblioteker er konvensjonelt gitt endelsen .dll.a
, å kombinere både Windows DLL suffiks og Unix-ar-suffiks., Filformatet er lik, men symboler som brukes for å markere import er forskjellige (_head_foo_dll vs __IMPORT_DESCRIPTOR_foo). Selv om dens GNU Binutils verktøyene kan generere import biblioteker og link til dem, det er raskere å lenke til DLL-filen direkte. Et eksperimentelt verktøy i MinGW kalt genlib kan brukes til å generere import libs med MSVC-stil symboler.
Symbolet oppløsning og bindingEdit
Hver funksjon eksporteres av en DLL-er identifisert av en numerisk ordenstallet og eventuelt et navn. Likeledes funksjoner kan være importert fra en DLL-enten ved ordenstallet eller ved navn., Ordenstallet representerer plasseringen av funksjonen er adressen peker i DLL-Eksport-Adresse bordet. Det er vanlig for interne funksjoner som skal eksporteres ved ordenstallet bare. For de fleste Windows API-funksjoner bare navn er bevart på tvers av forskjellige versjoner av Windows; den ordinals er underlagt for å endre. Dermed kan man ikke pålitelig importere Windows API funksjoner av deres ordinals.
Import funksjoner ved ordenstallet gir bare litt bedre ytelse enn å importere dem ved navn: eksportere tabeller av Dll-filer er sortert etter navn, så et binært søk kan brukes til å finne en funksjon., Indeksen funnet navn er deretter brukt til å lete opp ordenstallet i Eksport Ordenstallet bordet. I 16-bits Windows, navnet bordet var ikke sortert, slik at navnet oppslag overhead var mye mer merkbar.
Det er også mulig å binde en kjørbar til en bestemt versjon av en DLL-fil, som er, til å løse adresser av importerte funksjoner på compile-time. For bundet importen, linker sparer tidsstempel og kontrollsum av DLL-filen som skal importeres, er bundet av. Ved run-time Windows sjekker for å se om den samme versjonen av biblioteket blir brukt, og hvis så, Windows omgår behandling av import., Ellers, hvis biblioteket er forskjellig fra det som var bundet til, Windows prosesser importen i en normal måte.
Bundet kjørbare filer legg litt raskere hvis de kjører i samme miljø som de ble innsamlet for, og på nøyaktig samme tid hvis de kjøres i et annet miljø, så det er ingen ulempe for bindende import. For eksempel, alle vanlige Windows-programmer er bundet til system Dll-filer av deres respektive Windows-versjonen. En god mulighet til å binde en applikasjon for import til sitt mål miljøet er under programmet installasjon., Dette holder biblioteker bundet til neste OS-oppdatering. Det gjør imidlertid endre kontrollsummen for den kjørbare, så det er ikke noe som kan gjøres med signerte programmer, eller programmer som er administrert av et configuration management verktøy som bruker sjekksummer (for eksempel MD5 sjekksummer) å behandle fil-versjoner. Som nyere Windows-versjoner har beveget seg bort fra å ha faste adresser for hver lagt bibliotek (av sikkerhetshensyn), muligheten og verdien av bindende et kjørbart er synkende.,
Eksplisitt run-time linkingEdit
DLL-filer kan være eksplisitt er lagt på kjøre-time, en prosess som er referert til som run-time dynamisk linking av Microsoft, ved hjelp av LoadLibrary
(eller LoadLibraryEx
) API-funksjonen. GetProcAddress
API-funksjonen brukes til å slå opp eksportert symboler ved navn, og FreeLibrary
– for å losse-DLL-fil. Disse funksjonene er analogt til dlopen
, dlsym
, og dlclose
i POSIX-standarden API.,
prosedyren for eksplisitt run-time av skuffer er den samme i alle språk som støtter pekere til funksjoner, siden det kommer an på Windows API-snarere enn språklige konstruksjoner.
Forsinket loadingEdit
Normalt, en applikasjon som er knyttet mot en DLL-fil import bibliotek vil mislykkes i å starte hvis DLL-filen ikke finnes, fordi Windows ikke vil kjøre programmet med mindre det kan finne alle Dll-filer som programmet kan trenge. Men et program som kan være knyttet opp mot en import bibliotek for å tillate forsinket lasting av dynamisk bibliotek.,I dette tilfellet vil ikke operativsystemet prøver å finne eller laste DLL-når programmet starter; i stedet, en spire er inkludert i søknad av linker som vil prøve å finne og laste DLL gjennom LoadLibrary og GetProcAddress når en av dens funksjoner er kalt. Hvis DLL-filen ikke finnes, eller som er lagt i, eller det som kalles funksjonen ikke er tilgjengelig, vil programmet generere et unntak, som kan bli fanget og håndtert på riktig måte. Hvis programmet ikke håndtere unntak, vil det bli fanget opp av operativsystemet, som vil avslutte programmet med en feilmelding.,
forsinkelsen-lasting mekanismen gir også varsel kroker, slik at du lar programmet til å utføre ytterligere behandling eller feilhåndtering når DLL-filen er lastet, og/eller alle DLL-funksjonen kalles.
Legg igjen en kommentar