Сегменты до кучи в / proc / self / maps - PullRequest
0 голосов
/ 23 ноября 2010

Моя программа в определенный момент своего выполнения построчно считывает свою собственную / proc / self / maps до (и включая) кучу. Путь к программе "/ home / t4". Вот вывод:

00400000-00403000 r-xp 00000000 68:06 21629911 /home/t4
00602000-00603000 r--p 00002000 68:06 21629911 /home/t4
00603000-00604000 rw-p 00003000 68:06 21629911 /home/t4
00604000-00608000 rw-p 00000000 00:00 0
01905000-01926000 rw-p 00000000 00:00 0 [heap]

Я ожидал только четыре сегмента: код, константы, статические переменные, куча; но здесь их пять. Первым явно должен быть код, а последним - куча. Возможно, второе - это константы, но тогда каковы два других? Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Инициализированные статические переменные сопровождаются неинициализированными статическими переменными (.BSS), которые не нуждаются в хранении в двоичном файле.

1 голос
/ 24 ноября 2010

Первая - это сама исполняемая часть (из-за бита x), вторая, вероятно, .rodata (отсутствие бита w), третья - все остальное (.bss и .data).Четвертый результат - какой-то mmap вызов с использованием MAP_ANONYMOUS.Обратите внимание, что malloc (3) вполне может быть реализовано с использованием mmap (2), а не sbrk (2).Объект [heap] - это классическая sbrk-heap (и только она), и он не охватывает закрытые области записи, полученные с помощью mmap.Традиционный стек может быть указан как [stack], но стеки подпотоков могут использовать любую область памяти для хранения своего стека, обычно что-то malloc'd, поэтому вы также не увидите несколько [stack] s ...

Путаница завершена?: -)

...