Флаги в выводе объектного файла 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

Что означают эти флаги CONTENTS, ALLOC, LOAD и т. Д.?


person scdmb    schedule 25.06.2012    source источник


Ответы (2)


Вы видите интерпретацию комбинации флагов сегмента 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
comment
ссылка №2 сейчас не работает. :( - person The Mask; 12.04.2014
comment
Я попытался запустить objdump -h в перемещаемом файле (необработанный файл .o, т.е. файл без заголовков программы), и он по-прежнему перечислял разделы (например, .text) с атрибутом LOAD. Мне непонятно, в чем разница между LOAD и ALLOC. Может это просто ЗАГРУЗИТЬ = ALLOC && СОДЕРЖАНИЕ - person Troels Folke; 03.12.2017
comment
@TroelsFolke, да, библиотека BFD, на которой построена objdump, имеет жестко запрограммированную логику, согласно которой разделы, занимающие пространство как в двоичном (CONTENTS), так и в памяти (ALLOC), должны переходить в загружаемый сегмент (LOAD). LOAD - это атрибут сегмента, и поскольку .o файлы не имеют заголовков программ, его присутствие в выводе objdump является фальшивым (или, скорее, предполагаемым). - person Hristo Iliev; 04.12.2017
comment
@TroelsFolke, также стоит упомянуть, что то, что показывает objdump, является абстрактными разделами BFD с абстрактными атрибутами, построенными путем объединения атрибутов элементов базового типа объектного файла. Таким образом, readelf лучше подходит для анализа файлов ELF. - person Hristo Iliev; 04.12.2017

Нашел фрагменты информации о 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.

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

person Joseph Elcid    schedule 25.06.2012