Определить дно стека, начало и конец сегмента данных программы на С - PullRequest
1 голос
/ 18 ноября 2009

Я пытаюсь понять, как выделяется память для программы на Си. Для этого я хочу определить границы стека и сегмента данных. Есть ли какой-либо библиотечный или системный вызов, который выполняет эту работу? Я обнаружил, что основание стека можно определить, прочитав / proc / self / stat. Однако я не мог найти, как это сделать. Пожалуйста помоги. :)

Ответы [ 3 ]

2 голосов
/ 18 ноября 2009

Процессы больше не имеют ни одного «сегмента данных». У них есть куча отображений памяти в их адресное пространство. Общие случаи:

  • Совместно используемая библиотека или исполняемый код или родная информация, совместно используемая карта, без доступа для записи.
  • Сегменты кучи Glibc, анонимные сегменты, сопоставленные с разрешениями rw.
  • Области стека потоков. Они очень похожи на сегменты кучи, но, как правило, отделены друг от друга не отображенными защитными страницами.

Как указывает Николай, вы можете посмотреть их список с помощью инструмента pmap.

0 голосов
/ 18 ноября 2009

Посмотрите на /proc/<pid>/maps и /proc/<pid>/smaps (при условии Linux). Также pmap <pid>.

0 голосов
/ 18 ноября 2009

Нет общего способа сделать это. Фактически, некоторые из безопасных вычислительных сред рандомизируют точное распределение и порядок адресного пространства, поэтому атаки с внедрением кода более сложны для разработки.

Тем не менее, каждая библиотека времени выполнения C должна организовать вклады данных и сегментов стека, чтобы программа работала правильно. Чтение кода запуска во время выполнения - самый прямой способ найти ответ.

Какой компилятор C вас интересует?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...