Ответ 1
То, что вы видите, это интерпретация комбинации флагов сегмента 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
-able. Программный код, как правило, не модифицируется и, следовательно, раздел помещается в постоянное запоминающее устройство. Он содержит инструкции, которые должны выполняться, и, следовательно, флаг CODE
.
Инициализированные переменные со статическим классом хранения переходят в раздел .data
. Их начальные значения хранятся в файле и читаются оттуда при создании процесса. В C/С++ это глобальные переменные, статические локальные переменные и статические переменные-члены С++, которые инициализируются соответствующим образом, например. static int a = 10;
. Fortran помещает инициализированные SAVE
-d переменные и COMMON
блоки, которым присваивается интуитивное значение с помощью блока DATA
.
Раздел .bss
(историческое название, аббревиатура от Block Started by Symbol) является самым простым. Он содержит неинициализированные переменные со статическим классом хранения. Это раздел типа SHT_NOBITS
и не занимает пробела в файле. Память ALLOC
- для него, но из файла не считывается, чтобы предварительно заполнить память - он просто оставил все нули, доставленные распределителем памяти ядра.
Константы обычно входят в раздел .rodata
(не присутствует в вашем примере), который выглядит как .data
, но не помечен как записываемый и поэтому отображается как READONLY
.