ltrace -S
l'analisi di un esempio minimo mostra che mmap
è usato in glibc 2.23
In glibc 2.23, Ubuntu 16.04, in esecuzione latrace -S
su un programma minimo che utilizza dlopen
con:
ltrace -S ./dlopen.out
Spettacoli:
dlopen("libcirosantilli_ab.so", 1 <unfinished ...>
SYS_open("./x86_64/libcirosantilli_ab.so", 524288, 06267650550) = -2
SYS_open("./libcirosantilli_ab.so", 524288, 06267650550) = 3
SYS_read(3, "\177ELF\002\001\001", 832) = 832
SYS_brk(0) = 0x244c000
SYS_brk(0x246d000) = 0x246d000
SYS_fstat(3, 0x7fff42f9ce30) = 0
SYS_getcwd("/home/ciro/bak/git/cpp-cheat"..., 128) = 54
SYS_mmap(0, 0x201028, 5, 2050) = 0x7f1c323fe000
SYS_mprotect(0x7f1c323ff000, 2093056, 0) = 0
SYS_mmap(0x7f1c325fe000, 8192, 3, 2066) = 0x7f1c325fe000
SYS_close(3) = 0
SYS_mprotect(0x7f1c325fe000, 4096, 1) = 0
quindi vediamo immediatamente che dlopen
chiama open
+ mmap
.
Il fantastico ltrace
strumento traccia sia le chiamate in libreria che le chiamate di sistema ed è quindi perfetto per esaminare cosa sta succedendo in questo caso.
Un'analisi più ravvicinata mostra che open
restituisce il descrittore di file 3
(quello successivo dopo stdin, out ed err).
read
usa quindi quel descrittore di file, ma TODO perché mmap
gli argomenti sono limitati a quattro, e non possiamo vedere quale fd è stato usato lì poiché quello è il quinto argomento . strace
conferma come previsto che 3
è quello e l'ordine dell'universo viene ripristinato.
Le anime coraggiose possono anche avventurarsi nel codice glibc, ma non sono riuscito a trovare il mmap
dopo un grep veloce e sono pigro.
Testato con questo esempio minimo con build boilerplate su GitHub .