Терминология «сегмент данных» несколько устарела.
В системах Unix существует предположительно переносимый способ получения адреса end : просто вызовите brk
.Однако функция brk
поставляется с предупреждением.Со справочных страниц:
Функции brk и sbrk - это исторические курьезы, оставшиеся с более ранних дней до появления управления виртуальной памятью.
Подчеркните оригинал.
Если вы используете ELF: Если вы знаете, что используете двоичные файлы ELF, эта информация более или менее игнорируется при загрузке вашей программы.Программы ELF загружаются сегментами , , но .data
и .bss
являются секциями . Секции .data
и .bss
находятся в одном сегменте, но этот сегмент также имеетдругие разделы (.ctors
, .dtors
, .got
и т. д.).
Если вы используете Linux: Если вы знаете, что используете Linux специально, тогда вы можете сделать следующее:
Считать заголовки ELFиз вашего исполняемого файла.Вы можете использовать /proc/self/exe
, чтобы найти свой исполняемый файл.
Считать карты памяти из /proc/self/maps
.
Для карт, соответствующихВ своем файле вы можете определить, какая карта соответствует разделу .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 кажется самым надежным приемом, и для него тоже есть библиотеки.