Da Dll-filer er stort set den samme som EXEs, valg af at producere som en del af den link-processen er for klarhed, da det er muligt at eksportere funktioner og data fra begge.
det er ikke muligt at udføre en DLL direkte, da det kræver en e .e for operativsystemet at indlæse det gennem et indgangspunkt, og dermed eksistensen af værktøjer som RUNDLL.E ore eller RUNDLL32.E .e, der giver indgangspunktet og minimal ramme for DLL ‘ er, der indeholder tilstrækkelig funktionalitet til at udføre uden meget support.,
DLL ‘ er giver en mekanisme til delt kode og data, hvilket gør det muligt for en udvikler af delt kode / data at opgradere funktionalitet uden at kræve, at applikationer forbindes igen eller kompileres igen. Fra applikationsudviklingssynspunktet kan Windowsindo .s og OS/2 betragtes som en samling af DLL ‘ er, der opgraderes, så applikationer til en version af operativsystemet kan fungere i en senere, forudsat at OS-sælgeren har sikret, at grænsefladerne og funktionaliteten er kompatible.,
DLL ‘er udføres i opkaldsprocessens hukommelsesplads og med de samme adgangstilladelser, hvilket betyder, at der er lidt overhead i deres brug, men også at der ikke er nogen beskyttelse for den kaldende e .e, hvis DLL’ en har nogen form for fejl.
Memory managementEdit
i APINDO .s API er DLL-filerne organiseret i sektioner. Hvert afsnit har sit eget sæt attributter, såsom at være skrivbare eller skrivebeskyttede, eksekverbare (for kode) eller ikke-eksekverbare (for data) og så videre.,
koden i en DLL deles normalt blandt alle de processer, der bruger DLL ‘ en; det vil sige, de optager et enkelt sted i fysisk hukommelse og tager ikke plads i sidefilen. Windows kan ikke bruge position uafhængig kode for sin Dll ‘ er; i stedet koden gennemgår flytning, da det er fyldt, fastsættelse af adresser for alle sine indlæg peger på steder, som er gratis i hukommelsen af den første proces til at indlæse DLL., I ældre versioner af .indo .s, hvor alle kørende processer besatte et enkelt fælles adresserum, ville en enkelt kopi af DLL ‘ s kode altid være tilstrækkelig til alle processer. I nyere versioner af Windowsindo .s, der bruger separate adresserum for hvert program, er det dog kun muligt at bruge den samme flyttede kopi af DLL ‘en i flere programmer, hvis hvert program har de samme virtuelle adresser gratis til at rumme DLL’ s kode., Hvis nogle programmer (eller deres kombination af allerede indlæste DLL ‘er) ikke har disse adresser gratis, skal der oprettes en yderligere fysisk kopi af DLL’ s kode ved hjælp af et andet sæt flyttede indgangspunkter. Hvis den fysiske hukommelse, der er besat af en kodesektion, skal genvindes, kasseres dens indhold og genindlæses senere direkte fra DLL-filen efter behov.
i modsætning til kodesektioner er datasektionerne i en DLL normalt private; det vil sige, at hver proces, der bruger DLL ‘en, har sin egen kopi af alle DLL’ s data., Valgfrit kan datasektioner deles, hvilket tillader kommunikation mellem processer via dette delte hukommelsesområde. Men fordi brugerbegrænsninger ikke gælder for brugen af delt DLL-hukommelse, skaber dette et sikkerhedshul; nemlig kan en proces ødelægge de delte data, hvilket sandsynligvis vil medføre, at alle andre delingsprocesser opfører sig uønsket. For eksempel kan en proces, der kører under en gæstekonto, på denne måde ødelægge en anden proces, der kører under en privilegeret konto. Dette er en vigtig grund til at undgå brugen af delte sektioner i DLL ‘ er.,
Hvis en DLL komprimeres af visse eksekverbare packers (f.eks UP UP), er alle dens kode sektioner markeret som læse og skrive, og vil være unshared. Læse-og-skrive kode sektioner, ligesom private data sektioner, er private til hver proces. DLL ‘ er med delte datasektioner bør således ikke komprimeres, hvis de er beregnet til at blive brugt samtidigt af flere programmer, da hver programforekomst skulle bære sin egen kopi af DLL, hvilket resulterer i øget hukommelsesforbrug.
Import librariesEdit
ligesom statiske biblioteker, import biblioteker for DLL ‘ er er noteret af den .,lib filtypenavnet. For eksempel kernel32.dll, det primære dynamiske bibliotek til baseindo .s’ basisfunktioner som filoprettelse og hukommelsesstyring, er forbundet via kernel32.lib. Den sædvanlige måde at fortælle et importbibliotek fra et korrekt statisk bibliotek er efter størrelse: importbiblioteket er meget mindre, da det kun indeholder symboler, der henviser til den faktiske dll, der skal behandles på linktid. Begge er ikke desto mindre Uni.ar-formatfiler.
Linking til dynamiske biblioteker håndteres normalt ved at linke til et importbibliotek, når du bygger eller linker for at oprette en eksekverbar fil., Den oprettede eksekverbare indeholder derefter en import address table (iat), hvorved alle DLL-funktionskald refereres (hver refereret DLL-funktion indeholder sin egen post i iat). Ved køretid er IAT fyldt med passende adresser, der peger direkte på en funktion i den separat indlæste DLL.
I Cygwin/MSYS og MinGW, importere biblioteker, som er konventionelt givet endelsen .dll.a
, der kombinerer både Windows DLL-suffiks og Unix-ar-suffiks., Filformatet er ens, men de symboler, der bruges til at markere importen, er forskellige (_head_foo_dll vs __IMPORT_DESCRIPTOR_foo). Selvom dens GNU Binutils toolchain kan generere importbiblioteker og linke til dem, er det hurtigere at linke direkte til DLL ‘ en. Et eksperimentelt værktøj i Ming.kaldet genlib kan bruges til at generere import libs med MSVC-stil symboler.
Symbolopløsning og bindingEdit
hver funktion, der eksporteres af en DLL, identificeres ved en numerisk ordinal og eventuelt et navn. Ligeledes kan funktioner importeres fra en DLL enten ved ordinal eller ved navn., Ordenen repræsenterer placeringen af funktionens adressepeger i DLL-Eksportadressetabellen. Det er almindeligt, at interne funktioner kun eksporteres af ordinal. For de fleste APINDO .s API-funktioner bevares kun navnene på tværs af forskellige releasesindo .s-udgivelser; ordinalerne kan ændres. Således kan man ikke pålideligt importere APINDO .s API-funktioner ved deres ordinaler.import af funktioner efter ordinal giver kun lidt bedre ydelse end at importere dem ved navn: Eksporter tabeller med DLL ‘ er bestilles efter navn, så en binær søgning kan bruges til at finde en funktion., Indekset for det fundne navn bruges derefter til at slå ordinalen op i Eksportordenstabellen. I 16-bit vinduer blev navnetabellen ikke sorteret, så navnet opslag overhead var meget mere mærkbar.
det er også muligt at binde en eksekverbar til en bestemt version af en DLL, det vil sige at løse adresserne på importerede funktioner på kompileringstidspunktet. For bundet import gemmer linkeren tidsstempel og kontrolsum for den DLL, som importen er bundet til. Ved run-time checksindo .s kontrollerer, om den samme version af biblioteket bliver brugt, og i så fald omgår Windowsindo .s behandlingen af importen., Ellers, hvis biblioteket er forskellig fra den, der var bundet til, processesindo .s behandler importen på en normal måde.
bundne eksekverbare indlæses noget hurtigere, hvis de køres i det samme miljø, som de blev kompileret til, og nøjagtigt samme tid, hvis de køres i et andet miljø, så der er ingen ulempe ved at binde importen. For eksempel er alle standard applicationsindo .s-applikationer bundet til system-DLL ‘ erne i deres respektive releaseindo .s-udgivelse. En god mulighed for at binde en applikations import til sit målmiljø er under applikationens installation., Dette holder bibliotekerne ‘bundet’ indtil næste OS-opdatering. Det ændrer dog checksummen for den eksekverbare, så det er ikke noget, der kan gøres med underskrevne programmer, eller programmer, der administreres af et konfigurationsstyringsværktøj, der bruger checksums (såsom MD5 checksums) til at administrere filversioner. Da nyere versionsindo .s-versioner er flyttet væk fra at have faste adresser for hvert indlæst bibliotek (af sikkerhedsmæssige årsager), falder muligheden og værdien af at binde en eksekverbar.,
Eksplicitte run-time linkingEdit
DLL-filer kan være eksplicit lagt på run-time, en proces, der blot kaldes run-time dynamisk forbinder med Microsoft, ved hjælp LoadLibrary
(eller LoadLibraryEx
) API-funktionen. Funktionen GetProcAddress
API bruges til at slå eksporterede symboler op efter navn og FreeLibrary
– for at aflæse DLL ‘ en. Disse funktioner svarer til dlopen
dlsym
og dlclose
i POSIX-standard API.,
proceduren for eksplicit run-time-linking er den samme på ethvert sprog, der understøtter henvisninger til funktioner, da det afhænger af APINDO .s API snarere end sprogkonstruktioner.
Forsinket loadingEdit
Normalt, et program, der er knyttet mod en DLL ‘ s import bibliotek vil ikke starte, hvis DLL ikke blev fundet, fordi Windows ikke vil køre programmet, medmindre det kan finde alle de Dll-filer, som programmet kan få brug for. En applikation kan dog være knyttet til et importbibliotek for at tillade forsinket indlæsning af det dynamiske bibliotek.,I dette tilfælde vil operativsystemet ikke forsøge at finde eller indlæse DLL ‘en, når applikationen starter; i stedet er en stub inkluderet i applikationen af linkeren, som vil forsøge at finde og indlæse DLL’ en gennem LoadLibrary og GetProcAddress, når en af dens funktioner kaldes. Hvis DLL ‘ en ikke kan findes eller indlæses, eller den kaldte funktion ikke findes, genererer applikationen en undtagelse, som kan blive fanget og håndteret korrekt. Hvis applikationen ikke håndterer undtagelsen, vil den blive fanget af operativsystemet, som afslutter programmet med en fejlmeddelelse.,
forsinkelsesindlæsningsmekanismen giver også meddelelseskroge, så applikationen kan udføre yderligere behandling eller fejlhåndtering, når DLL ‘ en er indlæst og / eller en DLL-funktion kaldes.
Skriv et svar