ltrace -Sanalisis contoh minimal menunjukkan bahwa mmapdigunakan dalam glibc 2.23
Di glibc 2.23, Ubuntu 16.04, berjalan latrace -Spada program minimal yang digunakan dlopendengan:
ltrace -S ./dlopen.out
menunjukkan:
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
jadi kami segera melihat bahwa dlopenpanggilan open+ mmap.
Alat luar biasa ini ltracemelacak panggilan perpustakaan dan panggilan sistem, dan karenanya sempurna untuk memeriksa apa yang terjadi dalam kasus ini.
Analisis yang lebih dekat menunjukkan bahwa openmengembalikan deskriptor file 3(yang berikutnya gratis setelah stdin, out dan err).
readkemudian menggunakan file descriptor itu, tetapi TODO mengapa mmapargumen dibatasi hingga empat, dan kita tidak bisa melihat mana fd digunakan di sana karena itu adalah argumen ke-5 . stracemenegaskan seperti yang diharapkan itu 3adalah satu, dan tatanan alam semesta dipulihkan.
Jiwa yang berani juga dapat menjelajah ke kode glibc, tetapi saya tidak dapat menemukan mmapsetelah grep cepat dan saya malas.
Diuji dengan contoh minimal ini dengan membuat boilerplate di GitHub .