Сколько секций можно создать в объектном файле?

Я следую курсу Baking Pi – Разработка операционных систем . В ней они создали еще один раздел .init .

Итак, можем ли мы создать столько разделов, сколько хотим (не только .data, .bss, .text ), и можем ли мы поместить код и данные (инициализированные no) в любом из них ?.

Если да, то в чем же суть секций?

2 Solutions collect form web for “Сколько секций можно создать в объектном файле?”

Первоначальные исследования

На первый взгляд кажется, что ответ будет «нет», спецификация для ELF допускает только следующие разделы.

 C32/kernel/bin/.process.o architecture: i386, flags 0x00000011: HAS_RELOC, HAS_SYMS start address 0x00000000 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000333 00000000 00000000 00000040 2**4 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000050 00000000 00000000 00000380 2**5 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 000003d0 2**2 ALLOC 3 .note 00000014 00000000 00000000 000003d0 2**0 CONTENTS, READONLY 4 .stab 000020e8 00000000 00000000 000003e4 2**2 CONTENTS, RELOC, READONLY, DEBUGGING 5 .stabstr 00008f17 00000000 00000000 000024cc 2**0 CONTENTS, READONLY, DEBUGGING 6 .rodata 000001e4 00000000 00000000 0000b400 2**5 CONTENTS, ALLOC, LOAD, READONLY, DATA 7 .comment 00000023 00000000 00000000 0000b5e4 2**0 CONTENTS, READONLY 

Источник: http://wiki.osdev.org/ELF

Другие источники, такие как Википедия, также показывают только самые основные названия разделов, заставляя вас думать, что это все, что разрешено. Дополнительный поиск показал, что есть и эти 2 секции:

.fini

В этом разделе содержатся исполняемые инструкции, которые вносят вклад в код завершения процесса. То есть, когда программа завершается нормально, система организует выполнение кода в этом разделе.

.в этом

В этом разделе содержатся исполняемые инструкции, которые вносят вклад в код инициализации процесса. То есть, когда программа начинает работать, система организует выполнение кода в этом разделе перед основной точкой ввода программы (называемой main в программах на C).

.init и .fini имеют особое назначение. Если функция помещена в секцию .init , система выполнит ее перед основной функцией. Также функции, помещенные в секцию .fini будут выполняться системой после возвращения основной функции. Эта функция используется компиляторами для реализации глобальных конструкторов и деструкторов в C ++.

Источник: http://l4u-00.jinr.ru/usoft/WWW/www_debian.org/Documentation/elf/node3.html

Но, да, вы можете иметь любые разделы

Но благодаря @AProgrammer, указав мне на фактическую спецификацию ELF v1.2 , на странице 1-16 есть параграф, который гласит следующее:

Названия разделов с префиксом точки (.) Зарезервированы для системы, хотя приложения могут использовать эти разделы, если их существующие значения являются удовлетворительными. Приложения могут использовать имена без префикса, чтобы избежать конфликтов с разделами системы. Формат объектного файла позволяет определить разделы, не перечисленные выше. Объектный файл может иметь более одного раздела с тем же именем.

Таким образом, похоже, что полностью зависит от того, какие разделы он хочет использовать.

То, что разрешено, поскольку имена разделов и разделов зависят от формата файла. Для ELF определение формата определяет кучу и их назначение, а затем говорит:

Названия разделов с префиксом точки (.) Зарезервированы для системы, хотя приложения могут использовать эти разделы, если их существующие значения являются удовлетворительными. Приложения могут использовать имена без префикса, чтобы избежать конфликтов с разделами системы. Формат объектного файла позволяет определить разделы, не перечисленные выше. Объектный файл может иметь более одного раздела с тем же именем.

Итак, да, вы можете создавать разделы с любым именем, которое вы хотите, то, как система будет обрабатывать их, определяется их типами и атрибутами.

  • Повторное сжатие автономного файла ELF vmlinux
  • 2 разных libelf.h и libdwarf.h во FreeBSD?
  • Могу ли я прочитать, какие CCFLAGS использовались для создания двоичного файла?
  • Что такое ELF Magic?
  • Обнаружить, если бинарник ELF был построен с помощью gprof?
  • GNU-компоновщик, создающий бесполезное расстояние между разделами в файле ELF
  • В чем разница между readelf и eu-readelf?
  • Когда исполняемые файлы не дублируются,
  • Linux и Unix - лучшая ОС в мире.