ltrace -Sl'analisi di un esempio minimo mostra che mmapè usato in glibc 2.23
In glibc 2.23, Ubuntu 16.04, in esecuzione latrace -Ssu un programma minimo che utilizza dlopencon:
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 dlopenchiama open+ mmap.
Il fantastico ltracestrumento 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 openrestituisce il descrittore di file 3(quello successivo dopo stdin, out ed err).
readusa quindi quel descrittore di file, ma TODO perché mmapgli argomenti sono limitati a quattro, e non possiamo vedere quale fd è stato usato lì poiché quello è il quinto argomento . straceconferma 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 mmapdopo un grep veloce e sono pigro.
Testato con questo esempio minimo con build boilerplate su GitHub .