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