ltrace -S
analiza minimalnego przykładu pokazuje, że mmap
jest używany w glibc 2.23
W glibc 2.23, Ubuntu 16.04, działający latrace -S
na minimalnym programie, który używa dlopen
z:
ltrace -S ./dlopen.out
przedstawia:
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
więc natychmiast widzimy, że dlopen
wzywa open
+ mmap
.
To niesamowite ltrace
narzędzie śledzi zarówno wywołania biblioteki, jak i wywołania systemowe, dlatego idealnie nadaje się do sprawdzenia, co się dzieje w tym przypadku.
Bliższa analiza pokazuje, że open
zwraca deskryptor pliku 3
(następny wolny po stdin, out i err).
read
następnie używa tego deskryptora pliku, ale TODO, dlaczego mmap
argumenty są ograniczone do czterech, i nie możemy zobaczyć, który fd został tam użyty, ponieważ jest to piąty argument . strace
potwierdza zgodnie z oczekiwaniami, że 3
jest to jeden, i porządek wszechświata jest przywrócony.
Dzielne dusze mogą również odważyć się na kod glibc, ale nie mogłem znaleźć mmap
szybkiego grepa i jestem leniwy.
Przetestowano na tym minimalnym przykładzie z kompilacją płyty grzewczej na GitHub .