ltrace -SDie Analyse eines Minimalbeispiels zeigt, dass mmapes in glibc 2.23 verwendet wird
In glibc 2.23, Ubuntu 16.04, ausgeführt latrace -Sauf einem Minimalprogramm, das verwendet wird dlopenmit:
ltrace -S ./dlopen.out
zeigt an:
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
so sehen wir sofort, dass dlopenruft open+ mmap.
Das fantastische ltraceTool verfolgt sowohl Bibliotheksaufrufe als auch Systemaufrufe und ist daher perfekt, um zu untersuchen, was in diesem Fall vor sich geht.
Eine genauere Analyse zeigt, dass opender Dateideskriptor zurückgegeben wird 3(nächster freier nach stdin, out und err).
readverwendet dann diesen Dateideskriptor, aber die Argumente von TODO why mmapsind auf vier beschränkt, und wir können nicht sehen, welches fd dort verwendet wurde, da dies das fünfte Argument ist . stracebestätigt, wie erwartet, dass dies 3der Fall ist, und die Ordnung des Universums wird wiederhergestellt.
Tapfere Seelen können sich auch in Glibc-Code wagen, aber ich konnte den mmapnach einem kurzen Grep nicht finden und bin faul.
Getestet mit diesem Minimalbeispiel mit Build Boilerplate auf GitHub .