Флаги в выводе объектного файла objdump

Этот вывод objdump есть в каком-то объектном файле:

$ objdump -h main.o

main.o:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000000b  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000040  2**2
                  ALLOC
  3 .note.GNU-stack 00000000  00000000  00000000  00000040  2**0
                  CONTENTS, READONLY, CODE

Что означают эти флаги СОДЕРЖАНИЕ, ALLOC, LOAD и т.д.?

Ответ 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.

Ответ 2

Нашел фрагменты информации Ubuntu elf man page, и это только мое понимание.
Я думаю, что это информация как из program header, так и section header.

LOAD: may correspond to PT_LOAD in the Program header table. Brief description:
It specifies the type of that particular element in the program header table.
The array element specifies a loadable segment

ALLOC: may correspond to SHF_ALLOC in the section table. Brief description:
Its specifies the flag of that particular element in the section header.
This  section  occupies  memory during process execution.

CODE/ DATA: indicates the belonging segment

READONLY: specifies a read-only segment

CONTENTS: I didn't find anything to conclude.

Надеюсь, что это поможет