ltrace -S
phâ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 -S
trên một chương trình tối thiểu sử dụng dlopen
vớ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 dlopen
cuộc gọi open
+ mmap
.
Công ltrace
cụ 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 open
trả về bộ mô tả tệp 3
(cái miễn phí tiếp theo sau stdin, out và err).
read
sau đó sử dụng bộ mô tả tệp đó, nhưng TODO tại sao mmap
cá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 . strace
xác nhận như mong đợi đó 3
là 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 mmap
sau 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 .