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

В некотором объектном файле есть вывод 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 и так далее?

Ответы на вопрос(2)

Решение Вопроса

что вы видите, является интерпретацией комбинации флагов сегмента ELF, типа раздела и флагов раздела для каждого раздела в объектном файле.

LOAD means that the section resides in a loadable segment, i.e. its content could be read from the file into memory when a process is created

Флаги раздела хорошо документированы вГлава 4 бинарного интерфейса приложения System V, хотя под немного другими именамиobjdump показывает.

CODE means that the section contains executable code; it is indicated by the SHF_EXECINSTR flag in the section header DATA means that the section is not executable but is writable, indicated by the presence of the SHF_WRITE flag READONLY means that the section is neither executable nor writtable and should be placed in read-only memory pages ALLOC means that the section occupies memory, e.g. memory pages are actually allocated to hold the section content when a process is created, indicated by the SHF_ALLOC flag. Some sections, e.g. those containing debug information, are not read into memory during normal program execution and are not marked as ALLOC to save memory.

Разделы типаSHT_PROGBITS имеют соответствующий контент в файле и отображаются какCONTENTS, Некоторые разделы не имеют соответствующего содержимого в файле, например,.bss раздел, который имеет типSHT_NOBITS.

.text Раздел содержит исполняемый код программы. Это шоу какCONTENTS так как это типаSHT_PROGBITS, Память должна быть зарезервирована для этого раздела, так какALLOC и его содержимое должно быть загружено из файла, так как он помещен вLOADВозможный сегмент. Программный код, как правило, не модифицируется, и, следовательно, раздел помещается в постоянную память. Он содержит инструкции, которые должны быть выполнены, и, следовательно,CODE флаг.

Initialised переменные со статическим классом хранения идут в.data раздел. Их начальные значения сохраняются в файле и читаются оттуда по мере создания процесса. В C / C ++ это глобальные переменные, статические локальные переменные и статические переменные-члены C ++, которые инициализируются соответствующим образом, например,static int a = 10;, Фортранские места инициализированыSAVE-d переменные иCOMMON блоки, которым присваивается начальное значение с помощью блокаDATA Заявление там.

.bss раздел (историческое название, аббревиатура отBlock Started by Symbol) самый простой. Держитuninitialised переменные со статическим классом хранения. Это раздел типаSHT_NOBITS и не занимает места в файле. Память естьALLOCдля этого, но ничего не читается из файла для предварительного заполнения памяти - он просто сохраняет все нули, как доставлено распределителем памяти ядра.

Константы обычно идут в.rodata раздел (не представлен в вашем примере), который выглядит как.data но не помечен как доступный для записи и поэтому отображается какREADONLY.

 12 апр. 2014 г., 21:36
ссылка № 2 разорвана. :(
 03 дек. 2017 г., 18:49
Я попытался запустить objdump -h для перемещаемого файла (необработанного .o файла, то есть файла без заголовков программы), и он по-прежнему перечислял разделы (например, .text) с атрибутом LOAD. Так что мне не ясно, в чем разница между LOAD и ALLOC. Может быть, это просто LOAD = ALLOC & amp; & amp; СОДЕРЖАНИЕ
 04 дек. 2017 г., 09:49
@TroelsFolke, также стоит упомянуть, чтоobjdump показывает абстрактные разделы BFD с абстрактными атрибутами, построенными путем объединения атрибутов элементов базового типа объектного файла. Таким образом,readelf лучше подходит для анализа файлов ELF.
 04 дек. 2017 г., 09:40
@TroelsFolke, да, библиотека BFD, котораяobjdump построен на жестко закодированной логике, что разделы, которые занимают пространство в двоичном виде (CONTENTS) и память (ALLOC) должен войти в загружаемый сегмент (LOAD). LOAD является атрибутом сегмента, и так как.o файлы не имеют заголовков программы, его наличие на выходеobjdump является "поддельным" (точнее предполагается).
 13 апр. 2014 г., 02:23
Жаль, действительно.

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.

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

Ваш ответ на вопрос