ltrace -Sphân tích một ví dụ tối thiểu cho thấy mmapđược sử dụng trong glibc 2.23
Trong glibc 2.23, Ubuntu 16.04, chạy latrace -Strên một chương trình tối thiểu sử dụng dlopenvới:
ltrace -S ./dlopen.out
trình diễn:
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
vì vậy chúng tôi thấy ngay rằng dlopencuộc gọi open+ mmap.
Công ltracecụ tuyệt vời theo dõi cả các cuộc gọi thư viện và các cuộc gọi hệ thống, và do đó hoàn hảo để kiểm tra những gì đang xảy ra trong trường hợp này.
Một phân tích gần hơn cho thấy opentrả về bộ mô tả tệp 3(cái miễn phí tiếp theo sau stdin, out và err).
readsau đó sử dụng bộ mô tả tệp đó, nhưng TODO tại sao mmapcác đối số bị giới hạn ở bốn và chúng ta không thể thấy fd nào được sử dụng ở đó vì đó là đối số thứ 5 . stracexác nhận như mong đợi đó 3là một, và trật tự của vũ trụ được phục hồi.
Những linh hồn dũng cảm cũng có thể mạo hiểm với mã glibc, nhưng tôi không thể tìm thấy mmapsau một grep nhanh và tôi lười biếng.
Đã thử nghiệm với ví dụ tối thiểu này với bản dựng sẵn trên GitHub .