Я выполнил трассировку простого исполняемого файла, а затем попытался сопоставить записи в /proc/{pid}/maps с вызовами mmap. На ранних этапах выполнения двоичный файл загружает и отображает /etc/ld.so.cache. strace говорит, что это 0x7fa2bc468000, но /proc/{pid}/maps сообщает, что это конец предыдущего блока с /etc/ld.so. кэш фактически отображается позже по адресу 0x7fa2bc485000. В промежутке между 0x7fa2bc468000 0x7fa2bc485000 достаточно места, чтобы вместить запрошенный 116336B. Все остальные mmap соответствуют тому, что сообщает strace. Приходится предполагать, что адреса, по которым сообщается трассировка, верны. Тогда возникает вопрос: почему procfs не сообщает о начале /etc/ld.so.cache, где он на самом деле отображается??
/proc/{ pid}/maps:
Примечание: вывод передается в тривиальный скрипт, который добавляет пробел к предыдущему региону и длинуg каждого региона:
$ sudo cat /proc/21416/maps | gap_len.py
gap len address perms offset dev inode pathname
93973797036032 4096 5577faca6000-5577faca7000 r--p 00000000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca7000-5577faca8000 r-xp 00001000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca8000-5577faca9000 r--p 00002000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca9000-5577facaa000 r--p 00002000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577facaa000-5577facab000 rw-p 00003000 fe:01 12724957 /home/sam/code/c/sleep-forever
46363121184768 139264 7fa2bc292000-7fa2bc2b4000 r--p 00000000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 1413120 7fa2bc2b4000-7fa2bc40d000 r-xp 00022000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 323584 7fa2bc40d000-7fa2bc45c000 r--p 0017b000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 16384 7fa2bc45c000-7fa2bc460000 r--p 001c9000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 8192 7fa2bc460000-7fa2bc462000 rw-p 001cd000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 24576 7fa2bc462000-7fa2bc468000 rw-p 00000000 00:00 0
118784 4096 7fa2bc485000-7fa2bc486000 r--p 00000000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 131072 7fa2bc486000-7fa2bc4a6000 r-xp 00001000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 32768 7fa2bc4a6000-7fa2bc4ae000 r--p 00021000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
4096 4096 7fa2bc4af000-7fa2bc4b0000 r--p 00029000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 4096 7fa2bc4b0000-7fa2bc4b1000 rw-p 0002a000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 4096 7fa2bc4b1000-7fa2bc4b2000 rw-p 00000000 00:00 0
390483591168 135168 7ffda6ede000-7ffda6eff000 rw-p 00000000 00:00 0 [stack]
753664 16384 7ffda6fb7000-7ffda6fbb000 r--p 00000000 00:00 0 [vvar]
0 8192 7ffda6fbb000-7ffda6fbd000 r-xp 00000000 00:00 0 [vdso]
след:
$ strace ./sleep-forever
execve("./sleep-forever", ["./sleep-forever"], 0x7ffddc44c8d0 /* 58 vars */) = 0
brk(NULL) = 0x5577fc7d3000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=116336, ...}) = 0
mmap(NULL, 116336, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa2bc468000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260>\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1901536, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa2bc466000
mmap(NULL, 1914496, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa2bc292000
mmap(0x7fa2bc2b4000, 1413120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7fa2bc2b4000
mmap(0x7fa2bc40d000, 323584, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17b000) = 0x7fa2bc40d000
mmap(0x7fa2bc45c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c9000) = 0x7fa2bc45c000
mmap(0x7fa2bc462000, 13952, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa2bc462000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7fa2bc467540) = 0
mprotect(0x7fa2bc45c000, 16384, PROT_READ) = 0
mprotect(0x5577faca9000, 4096, PROT_READ) = 0
mprotect(0x7fa2bc4af000, 4096, PROT_READ) = 0
munmap(0x7fa2bc468000, 116336) = 0
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=4294967295, tv_nsec=0},
Программа тестирования:
#include
#include
#include
int main(void) {
printf("Starting. Sleeping forever\n");
const char * x = malloc(1);
sleep(-1);
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... d-so-cache
Несоответствие адресов mmap и /proc/pid/maps для /etc/ld.so.cache ⇐ Linux
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Отслеживайте вызовы функций дочернего процесса, используя /proc/pid/maps и ptrace.
Anonymous » » в форуме Linux - 0 Ответы
- 114 Просмотры
-
Последнее сообщение Anonymous
-
-
-
В чем разница между «mmap.mmap» и «tempfile.SpooledTemporaryFile» в stdlib Python?
Anonymous » » в форуме Python - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-