Как получить данные и адресное пространство bss во время выполнения (в программе Unix C) - PullRequest
0 голосов
/ 20 января 2012

Мне нужно получить адресное пространство bss и раздел данных сегмента DATA во время выполнения. Мне нужен начальный и конечный адрес каждого раздела.

Ответы [ 2 ]

5 голосов
/ 20 января 2012

Терминология «сегмент данных» несколько устарела.

В системах Unix существует предположительно переносимый способ получения адреса end : просто вызовите brk.Однако функция brk поставляется с предупреждением.Со справочных страниц:

Функции brk и sbrk - это исторические курьезы, оставшиеся с более ранних дней до появления управления виртуальной памятью.

Подчеркните оригинал.

Если вы используете ELF: Если вы знаете, что используете двоичные файлы ELF, эта информация более или менее игнорируется при загрузке вашей программы.Программы ELF загружаются сегментами , , но .data и .bss являются секциями . Секции .data и .bss находятся в одном сегменте, но этот сегмент также имеетдругие разделы (.ctors, .dtors, .got и т. д.).

Если вы используете Linux: Если вы знаете, что используете Linux специально, тогда вы можете сделать следующее:

  1. Считать заголовки ELFиз вашего исполняемого файла.Вы можете использовать /proc/self/exe, чтобы найти свой исполняемый файл.

  2. Считать карты памяти из /proc/self/maps.

  3. Для карт, соответствующихВ своем файле вы можете определить, какая карта соответствует разделу .data, посмотрев на смещения.

Если вы используете glibc: Символ__data_start указывает на начало раздела данных, и я думаю, что я также видел __bss_start, определенный также.

extern char __data_start;
extern char __bss_start;
void *get_data_start(void) { return &__data_start; }

Но ... что вы пытаетесьдостичь? наиболее продуктивно объяснить, почему вы хотите знать, где находятся разделы.Вы пишете сборщик мусора?Отладчик?Хотите сохранить образы процесса?

Слово предупреждения: Кто знает, когда что-либо из вышеперечисленного сломается.Может быть, __data_start не определено, или brk указывает на какую-то не связанную область памяти.Чтение заголовков ELF кажется самым надежным приемом, и для него тоже есть библиотеки.

0 голосов
/ 20 января 2012

Возможно, не удовлетворительный ответ, но в Linux вы можете использовать / proc / self / exe, который содержит - символическую ссылку на ваш образ процесса.

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