View Single Post
Sitat av 0xFF Vis innlegg
Jeg jobber typisk på Linux systemer, men dette minnet meg på et spørsmål jeg hadde for en stund siden da jeg tok på meg et lite oppdrag med å programmere et lite program i Windows, selve bruksområdet for programmet var vel ikkje helt etter boka, men hva kundene mine bruker programmene til er ikkje akkurat mitt problem.

Jeg er klar over at det er mulig, men hvor omfattende er det? Kan jeg lage en custom funksjon ala LoadLibrary () som allokerer X size størrelse i heap'en og bare leser DLL filen inn i den for så å lage funksjonspointere til funksjonens adresser? Eller må jeg ta hensyn til at DLL filen består av flere forskjellige segmenter som .data, .code, .text?
Vis hele sitatet...
Hva sections en fil inneholder ønsker du som programmerer egentlig ikke å vite om. På unix systemer bruker du dlopen og dlsym for å laste inn et bibliotek, samt å finne symboler i den. Forskjellige operativsystemer kan ha forskjellige magi som skjer for dlopen. På Linux skjer det meste av magien i userspace som fører til en rekke mmap() kall. Du kan se dette i praksis med å utføre strace på nesten er hvilket som helst program. De fleste programmer er linket til .so filer for å fungere i segselv (runtime linking):

Kode

root@host:/# strace ls 2>&1|head
execve("/bin/ls", ["ls"], [/* 21 vars */]) = 0
brk(0)                                  = 0xf34000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f30f10be000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=20380, ...}) = 0
mmap(NULL, 20380, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f30f10b0000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
På windows systemer (såvidt meg bekjent) er det faktisk kernel som håndterer dll loading.
Sist endret av mywave; 30. mars 2014 kl. 00:54.