Файл /proc/pid/maps
в Linux предоставляет некоторую информацию о отображениях памяти процесса:
$ cat /proc/self/maps
00400000-0040b000 r-xp 00000000 08:03 709349 /bin/cat
0060a000-0060b000 r--p 0000a000 08:03 709349 /bin/cat
0060b000-0060c000 rw-p 0000b000 08:03 709349 /bin/cat
00a2d000-00a4e000 rw-p 00000000 00:00 0 [heap]
7f6fdf418000-7f6fdf6bd000 r--p 00000000 08:03 489885 /usr/lib/locale/locale-archive
...
7fff4669e000-7fff466bf000 rw-p 00000000 00:00 0 [stack]
7fff467ff000-7fff46800000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Команда pmap(1)
форматирует эту информацию в виде, который я считаю более приятным:
$ pmap $$
11680: bash
0000000000400000 896K r-x-- /bin/bash
...
00007ff31ae2d000 8K rw--- /lib/x86_64-linux-gnu/ld-2.13.so
00007fff66dd2000 132K rw--- [ stack ]
00007fff66dff000 4K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 29336K
Кстати, в исходном файле eglibc dl-execstack.c
я обнаружил следующий комментарий: Не существует переносимого способа узнать границы стека исходного потока, чтобы mprotect
it. Это, вероятно, означает, что лучший механизм - это анализ файлов /proc/pid/maps
, хотя я думаю, что мы все согласны, что это плохо.