Вы видите интерпретацию комбинации флагов сегмента ELF, типа раздела и флагов раздела для каждого раздела в объектном файле.
LOAD
означает, что раздел находится в загружаемом сегменте, т.е. его содержимое может быть прочитано из файла в память при создании процесса.
Флаги разделов хорошо документированы в главе 4 двоичного интерфейса приложения System V, хотя под немного другими именами, чем показывает objdump
.
CODE
означает, что раздел содержит исполняемый код; на это указывает флаг SHF_EXECINSTR
в заголовке раздела
DATA
означает, что раздел не исполняемый, но доступен для записи, на что указывает наличие флага SHF_WRITE
READONLY
означает, что раздел не является ни исполняемым, ни записываемым и должен быть помещен в страницы памяти только для чтения.
ALLOC
означает, что раздел занимает память, например страницы памяти фактически выделяются для хранения содержимого раздела при создании процесса, на что указывает флаг SHF_ALLOC
. Некоторые разделы, например те, которые содержат отладочную информацию, не считываются в память во время нормального выполнения программы и не помечаются как ALLOC
для экономии памяти.
Разделы типа SHT_PROGBITS
имеют соответствующее содержимое в файле и отображаются как CONTENTS
. Некоторые разделы не имеют соответствующего содержимого в файле, например раздел .bss
, имеющий тип SHT_NOBITS
.
Раздел .text
содержит исполняемый код программы. Он отображается как CONTENTS
, поскольку относится к типу SHT_PROGBITS
. Для этого раздела следует зарезервировать память, так как это ALLOC
, и его содержимое должно быть загружено из файла, поскольку он помещен в LOAD
-способный сегмент. Программный код обычно не подлежит изменению, поэтому раздел помещается в постоянную память. Он содержит инструкции, которые должны быть выполнены, и, следовательно, флаг CODE
.
Инициализированные переменные со статическим классом хранения попадают в раздел .data
. Их начальные значения хранятся в файле и считываются оттуда по мере создания процесса. В C / C ++ это глобальные переменные, статические локальные переменные и статические переменные-члены C ++, которые инициализируются соответствующим образом, например static int a = 10;
. Фортран помещает инициализированные SAVE
-d переменные и COMMON
блоки, которым присваивается начальное значение с помощью оператора DATA
.
Раздел .bss
(историческое название, аббревиатура от Block Started by Symbol) - самый простой. Он содержит неинициализированные переменные со статическим классом хранения. Это раздел типа SHT_NOBITS
и не занимает места в файле. Память ALLOC
используется для этого, но ничего не читается из файла для предварительного заполнения памяти - он просто сохраняет все нули в том виде, в каком он был доставлен распределителем памяти ядра.
Константы обычно попадают в раздел .rodata
(отсутствует в вашем примере), который выглядит как .data
, но не помечен как доступный для записи и поэтому отображается как READONLY
.
person
Hristo Iliev
schedule
25.06.2012