[
Страница
назад | Страница
вперед | Содержание
| Индекс
| Библиотека | Юридическая
информация | Поиск ]
Программирование: Разработка и отладка программ
Таблица заголовков разделов объектного файла позволяет быстро находить
разделы файла. Таблица заголовков разделов - это массив структур
Elf32_Shdr или Elf64_Shdr. Таблица заголовков разделов
проиндексирована. Смещение таблицы от начала файла указано в элементе
e_shoff заголовка ELF. В элементе e_shnum указано число записей
таблицы заголовков разделов. В e_shentsize указан размер каждой записи.
Если число разделов больше либо равно SHN_LORESERVE (0xff00), то
e_shnum присваивается значение SHN_UNDEF (0), а действительное значение
количества разделов таблицы хранится в поле sh_size заголовка раздела по индексу
0 (в противном случае, элемент sh_size начальной записи содержит 0).
Если размер индекса ограничен, то некоторые индексы таблицы разделов могут
быть зарезервированы, например, элемент st_shndx записи таблицы имен,
также элементы e_shnum и e_shstrndx заголовка ELF. В таких случаях
зарезервированные значения не указывают на действительные разделы объектного
файла. Кроме того, в подобных случаях особое значение указывает, что
действительный индекс раздела хранится в другом месте в поле большего размера.
Особые индексы разделов
Имя |
Значение |
SHN_UNDEF |
0 |
SHN_LORESERVE
|
0xff00 |
SHN_LOPROC |
0xff00 |
SHN_HIPROC |
0xff1f |
SHN_LOOS |
0xff20 |
SHN_HIOS |
0xff3f |
SHN_ABS |
0xfff1 |
SHN_COMMON |
0xfff2 |
SHN_HIRESERVE
|
0xffff
|
- SHN_UNDEF
- Эти значением помечается ссылка на раздел, которая не определена,
отсутствует, неверная или лишена смысла по любой другой причине. Например, имя
ссылки на номер раздела SHN_UNDEF - это неопределенное имя.
Примечание: Хотя индекс 0 зарезервирован для неопределенного значения,
в таблице заголовков разделов есть запись с индексом 0. Если в элементе e_shnum
заголовка ELF указано, что в таблице заголовков разделов есть 6 записей, то эти
записи имеют индексы от 0 до 5. Содержимое начальной записи описано в этом
разделе ниже.
- SHN_LORESERVE
- Это значение указывает нижнюю границу диапазона зарезервированных
индексов.
- SHN_LOPROC - SHN_HIPROC
- Значения в этом диапазоне зависят от типа процессора.
- SHN_LOOS - SHN_HIOS
- Значения в этом диапазоне зависят от типа применяемой операционной
системы.
- SHN_ABS
- Это значение задает абсолютные значения соответствующих ссылок. Например,
у имен, связанных с номером раздела SHN_ABS, есть абсолютные значения,
и они не будут затрагиваться при перемещении.
- SHN_COMMON
- Имена, связанные с этим разделом, являются общими, например, имена FORTRAN
COMMON или неразмещенные внешние переменные языка С.
- SHN_HIRESERVE
- Это значение указывает верхнюю границу диапазона зарезервированных
индексов. Система резервирует индексы между SHN_LORESERVE и
SHN_HIRESERVE включительно; значения из этого диапазона не указывают на
таблицу заголовков разделов. Таблица заголовков разделов не содержит записей
для зарезервированных индексов.
Вся информация объектных файлов, за исключением заголовка ELF, таблицы
заголовков программы и таблицы заголовков разделов, хранится в разделах. Разделы
объектных файлов удовлетворяют следующим условиям:
- Для каждого раздела объектного файла есть в точности один заголовок.
Некоторым заголовкам могут не соответствовать разделы.
- Каждый раздел занимает непрерывную (возможно, пустую) область памяти.
- Разделы файла не могут перекрываться. В файле нет байтов, принадлежащих
нескольким разделам.
- В объектном файле может быть незанятое пространство. Не все байты файла
находятся в каком-либо разделе или заголовке. Содержимое незанятого
пространства не определено.
Структура заголовка раздела показана ниже.
typedef struct {
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
} Elf32_Shdr;
typedef struct {
Elf64_Word sh_name;
Elf64_Word sh_type;
Elf64_Xword sh_flags;
Elf64_Addr sh_addr;
Elf64_Off sh_offset;
Elf64_Xword sh_size;
Elf64_Word sh_link;
Elf64_Word sh_info;
Elf64_Xword sh_addralign;
Elf64_Xword sh_entsize;
} Elf64_Shdr;
|
Заголовок раздела
- sh_name
- В этом элементе указано имя раздела. Это индекс в таблице заголовков
разделов [см. Таблица
строк], по которому указан адрес строки с именем раздела.
- sh_type
- Этот элемент указывает категорию содержимого раздела. Типы разделов и их
описания приведены ниже.
- sh_flags
- Разделы поддерживают 1-разрядные флаги, задающие различные атрибуты.
Определения флагов приведены ниже.
- sh_addr
- Если раздел есть в образе процесса в памяти, то в этом элементе указан
адрес, по которому находится первый байт сегмента. В противном случае, элемент
содержит 0.
- sh_offset
- Значение этого элемента задает смещение от начала файла, по которому
находится первый байт раздела. Раздел типа SHT_NOBITS, описанный ниже,
не занимает места в файле, и его элемент sh_offset указывает возможное
положение в файле.
- sh_size
- В этом элементе указан размер раздела в байтах. Если тип размера не равен
SHT_NOBITS, раздел занимает sh_size байт в файле. Раздел типа
SHT_NOBITS может иметь ненулевой размер, но он не занимает места в
файле.
- sh_link
- В этом элементе хранится ссылка на индекс таблицы заголовков разделов; его
интерпретация зависит от типа раздела. Значения описаны в следующей таблице.
- sh_info
- В этом элементе хранится дополнительная информация; его интерпретация
зависит от типа раздела. Значения описаны в следующей таблице.
Если в поле sh_flags этого заголовка раздела указан атрибут SHF_INFO_LINK,
то элемент представляет индекс таблицы заголовков разделов.
- sh_addralign
- Для некоторых разделов определены правила выравнивания. Например, если в
разделе хранится двойное слово, то весь раздел должен быть выровнен по границе
двойного слова. Значение sh_addr должно быть кратно значению
sh_addralign. В данный момент поддерживается значение 0 и положительные
степени 2. Значения 0 и 1 указывают, что правил выравнивания для данного
раздела не существует.
- sh_entsize
- В некоторых разделах находится таблица записей одинакового размера,
например, таблица имен. Для таких разделов в данном элементе указан размер
каждой записи. Если раздел не содержит таблицу записей одинакового размера, то
в этом элементе указано значение 0.
Элемент sh_type заголовка раздела указывает тип раздела.
Типы разделов, sh_type
Имя |
Значение |
SHT_NULL |
0 |
SHT_PROGBITS |
1 |
SHT_SYMTAB |
2 |
SHT_STRTAB |
3 |
SHT_RELA |
4 |
SHT_HASH |
5 |
SHT_DYNAMIC |
6 |
SHT_NOTE |
7 |
SHT_NOBITS |
8 |
SHT_REL |
9 |
SHT_SHLIB |
10 |
SHT_DYNSYM |
11 |
SHT_INIT_ARRAY
|
14 |
SHT_FINI_ARRAY
|
15 |
SHT_PREINIT_ARRAY |
16 |
SHT_LOOS |
0x60000000
|
SHT_HIOS |
0x6fffffff
|
SHT_LOPROC |
0x70000000
|
SHT_HIPROC |
0x7fffffff
|
SHT_LOUSER |
0x80000000
|
SHT_HIUSER |
0xffffffff
|
- SHT_NULL
- Это значение помечает заголовок раздела как неактивный; ему не
соответствует раздел. Другие элементы такого заголовка раздела не определены.
- SHT_PROGBITS
- В этом разделе хранится информация, определенная программой. Формат
информации также определяется программой.
- SHT_SYMTAB и SHT_DYNSYM
- В этих разделах хранится таблица имен. В данный момент в объектном файле
может быть только один раздел каждого из этих типов, однако в будущем это
ограничение может быть снято. Обычно SHT_SYMTAB содержит имена для
статической компоновки, хотя они могут применяться и для динамической. Многие
имена из таблицы имен могут не применяться при динамической компоновке. В
целях экономии памяти в объектном файле иногда создается раздел
SHT_DYNSYM, содержащий минимальный набор имен для динамической
компоновки. Более подробная информация приведена в разделе Таблица
имен.
- SHT_STRTAB
- В разделе хранится таблица строк. В объектном файле может быть несколько
разделов с таблицами строк. Более подробная информация приведена в разделе Таблица
строк.
- SHT_RELA
- В этом разделе хранятся таблицы перемещения с явными дополнениями,
например, типов Elf32_Rela для 32-разрядного класса объектных файлов и
Elf64_Rela для 64-разрядного. В объектном файле может быть несколько
разделов с таблицами перемещения. Более подробная информация приведена в
разделе Перемещение.
- SHT_HASH
- В этом разделе хранится хэш-таблица имен. В данный момент в объектном
файле может быть только один раздел с хэш-таблицей, однако в будущем это
ограничение может быть снято. Более подробная информация приведена разделе Хэш-таблица
в Главе 32.
- SHT_DYNAMIC
- В этом разделе хранится информация для динамической компоновки. В данный
момент в объектном файле может быть только один такой раздел, однако в будущем
это ограничение может быть снято. Более подробная информация приведена в
разделе Динамический
раздел в главе 32.
- SHT_NOTE
- В этом разделе хранится информация, описывающая некоторым образом файл.
Более подробная информация приведена в разделе Раздел
примечаний главы 32.
- SHT_NOBITS
- Раздел этого типа не занимает места в файле, но похож на
SHT_PROGBITS. Хотя в этом разделе нет ни одного байта, в элементе
sh_offset указано его возможно смещение в файле.
- SHT_REL
- В этом разделе хранятся записи перемещения без явных дополнений, например,
типов Elf32_Rel для 32-разрядных классов файлов и Elf64_Rel для
64-разрядных. В объектном файле может быть несколько разделов с таблицами
перемещения. Более подробная информация приведена в разделе Перемещение.
- SHT_SHLIB
- Этот тип раздела зарезервирован, но его значение не определено.
- SHT_INIT_ARRAY
- В этом разделе хранится массив указателей на функции инициализации,
описанные в разделе Функции
инициализации и завершения главы 32. Каждый элемент массива указывает на
процедуру без параметров, не возвращающую значений.
- SHT_FINI_ARRAY
- В этом разделе хранится массив указателей на функции завершения, описанные
в разделе Функции
инициализации и завершения главы 32. Каждый элемент массива указывает на
процедуру без параметров, не возвращающую значений.
- SHT_PREINIT_ARRAY
- В этом разделе хранится массив указателей на функции, которые вызываются
перед функциями инициализации. Эти функции описаны в разделе Функции
инициализации и завершения главы 32. Каждый элемент массива указывает на
процедуру без параметров, не возвращающую значений.
- SHT_LOOS - SHT_HIOS
- Значения в этом диапазоне зависят от типа применяемой операционной
системы.
- SHT_LOPROC - SHT_HIPROC
- Значения в этом диапазоне зависят от типа процессора.
- SHT_LOUSER
- Это значение указывает нижнюю границу диапазона индексов,
зарезервированных для прикладных программ.
- SHT_HIUSER
- Это значение указывает верхнюю границу диапазона индексов,
зарезервированных для прикладных программ. Типы разделов, находящиеся в
диапазоне SHT_LOUSER - SHT_HIUSER, могут применяться прикладными
программами без риска возникновения конфликтов с текущими или будущими
системными типами.
Все остальные значения зарезервированы. Как было отмечено ранее, заголовок
раздела с индексом 0 (SHN_UNDEF), существует, хотя его индекс и указывает
на неопределенный сегмент. В этой записи хранится следующая информация.
Запись таблицы заголовков разделов:Индекс 0
Имя |
Значение |
Примечание |
sh_name |
0 |
Нет имени |
sh_type |
SHT_NULL |
Неактивный |
sh_flags |
0 |
Нет флагов |
sh_addr |
0 |
Нет адреса |
sh_offset |
0 |
Нет смещения |
sh_size |
Нет |
Если не равен нулю, то
указывает число записей заголовка раздела |
sh_link |
Нет |
Если не равен нулю, то
указывает индекс таблицы строк в заголовке раздела |
sh_info |
0 |
Нет вспомогательной
информации |
sh_addralign |
0 |
Нет выравнивания |
sh_entsize |
0 |
Нет записей
|
Элемент sh_flags заголовка раздела содержит 1-разрядные флаги,
задающие атрибуты раздела. Определенные значения показаны в следующей таблице,
все прочие значения зарезервированы.
Флаги атрибутов раздела
Имя |
Значение |
SHF_WRITE |
0x1 |
SHF_ALLOC |
0x2 |
SHF_EXECINSTR
|
0x4 |
SHF_MERGE |
0x10 |
SHF_STRINGS |
0x20 |
SHF_INFO_LINK
|
0x40 |
SHF_LINK_ORDER
|
0x80 |
SHF_OS_NONCONFORMING |
0x100 |
SHF_GROUP |
0x200 |
SHF_MASKOS |
0x0ff00000
|
SHF_MASKPROC |
0xf0000000
|
Если бит флага в sh_flags равен 1, то установлен соответствующий
атрибут для этого раздела. В противном случае, атрибут не установлен.
Неопределенные атрибуты равны 0.
- SHF_WRITE
- Раздел содержит данные, которые должны быть доступны для записи во время
выполнения процесса.
- SHF_ALLOC
- Этот раздел занимает память во время выполнения процесса. Некоторые
управляющие разделы не хранятся в образе объектного файла в памяти; для таких
разделов этот бит выключен.
- SHF_EXECINSTR
- Раздел содержит исполняемый код.
- SHF_MERGE
- Данные в разделах можно объединять, чтобы избежать их дублирования. Если
не задан флаг SHF_STRINGS, элементы данных в этом разделе имеют
одинаковый размер. Размер каждого элемента задается полем sh_entsize
заголовка раздела. Если задан флаг SHF_STRINGS, то элемент данных
состоит из символьных строк, завершающихся пустым символом. Размер каждого
символа задан в поле sh_entsize заголовка раздела.
Каждый элемент раздела сравнивается с другими элементами с тем же именем,
типом и флагами. Элементы с одинаковыми значениями объединяются в один.
Элементы перемещения для таких разделов должны преобразовываться в
объединенное значение. Учтите, что перемещаемые элементы, включая элементы,
перемещаемые во время выполнения, должны отдельно анализироваться, чтобы
выяснить, будут ли совпадать действительные значения, вычисленные во время
выполнения. Совместимый с ABI объектный файл не должен зависеть от того, были
ли объединены элементы, поэтому совместимый с ABI компоновщик может решить,
что некоторые элементы объединять не следует.
- SHF_STRINGS
- Элементы данных в этом разделе состоят из символьных строк, завершающихся
пустым символом. Размер каждого символа задан в поле sh_entsize
заголовка раздела.
- SHF_INFO_LINK
- В поле sh_info этого заголовка раздела хранится индекс таблицы
заголовков разделов.
- SHF_LINK_ORDER
- Этот флаг устанавливает для компоновщика дополнительные условия,
касающиеся порядка следования элементов. Эти условия применяются в том случае,
если поле sh_link этого заголовка раздела ссылается на другой раздел.
Если этот раздел объединяется в выходном файле с другими разделами, то он
должен находиться относительно этих разделов в том же положении, в котором по
отношению к ним находится раздел, на который ссылается данный.
Примечание: Обычно этот флаг применяется при создании таблицы,
ссылающейся на разделы текста или данных в порядке их следования в памяти.
- SHF_OS_NONCONFORMING
- Для правильного применения этого раздела помимо стандартных правил
компоновки (Правила
компоновки нераспознанных разделов) необходимы дополнительные действия со
стороны операционной системы. Если для этого раздела задано значение
sh_type или биты sh_flags из диапазона операционной системы, а
обрабатывающий этот раздел компоновщик не распознал эти значения, то объектный
файл, содержащий этот раздел, должен быть отклонен. При этом отправляется
сообщение об ошибке.
- SHF_MASKOS
- Все биты в этой маске зарезервированы для конкретной операционной системы.
- SHF_MASKPROC
- Все биты в этой маске зарезервированы для конкретного процессора. Их
применение описано в документации по процессору.
Элементы заголовка раздела sh_link и sh_info содержат
дополнительную информацию, зависящую от типа раздела.
Интерпретация sh_link
иsh_info
sh_type |
sh_link |
sh_info |
SHT_DYNAMIC |
Индекс таблицы строк,
применяемой записями из этого раздела. |
0 |
SHT_HASH |
Индекс таблицы имен, к
которой относится хэш-таблица. |
0 |
SHT_REL
SHT_RELA |
Индекс таблицы имен в
заголовке раздела. |
Индекс раздела, к
которому применяется перемещение. |
SHT_SYMTAB
SHT_DYNSYM |
Индекс таблицы строк в
заголовке раздела. |
На единицу превышает
индекс последнего локального (STB_LOCAL)имени в таблице имен.
|
SHT_GROUP |
Индекс таблицы имен в
заголовке раздела. |
Индекс записи в
связанной таблице имен. Имя из указанной записи таблицы имен содержит
название группы разделов. |
SHT_SYMTAB_SHNDX
|
Индекс раздела таблицы
имен в заголовке раздела. |
0 |
Когда компоновщик встречает раздел, заголовок которого содержит неизвестные
компоновщику значения sh_type или sh_flags, этот раздел
компонуется следующим образом.
Если флаги sh_flags раздела содержат атрибут
SHF_OS_NONCONFORMING, то для его обработки необходима дополнительная
информация, и компоновщик должен отклонить такой объект и отправить сообщение об
ошибке.
Нераспознанные разделы без атрибута SHF_OS_NONCONFORMING компонуются в
два этапа. Компоновщик должен учесть требования к выравниванию (заданные полем
sh_addralign) и, путем заполнения байтов между разделами нулями, создать
объект, удовлетворяющий самому строгому требованию среди входных разделов.
- На первом этапе объединяются разделы, у которых совпадают имена, типы и
атрибуты. Порядок объединения должен удовлетворять всем известным требованиям,
заданным атрибутами входных разделов (например, SHF_MERGE и
SHF_LINK_ORDER). Если не указано иное, разделы объединяются в порядке
следования.
- На втором этапе разделы присваиваются сегментам или другим единицам
памяти, в зависимости от атрибутов. Все разделы неизвестных типов объединяются
в один сегмент, причем внутри сегмента разделы одного типа должны
располагаться по-возможности рядом.
Для разделов неизвестных типов должны быть выполнены все действия, не
зависящие от операционной системы (например, перемещение). Таблица заголовков
выходного раздела, если она есть, должна содержать записи для всех неизвестных
разделов. Все флаги атрибутов нераспознанных разделов удаляются.
Примечание: Компоновщикам рекомендуется придерживаться этой
последовательности и при работе с разделами известных типов. Если это
необходимо, свободная память между разделами может заполняться символами,
отличными от 0.
Некоторые разделы объединяются в группы. Например, для внешнего определения
встроенной функции, помимо раздела с исполняемым кодом, может потребоваться
раздел, содержащий список литералов, несколько отладочных и других
информационных разделов. Более того, некоторые внутренние ссылки таких разделов
могут потерять смысл после удаления одного из разделов или замены его копией из
другого объекта. Следовательно, такие группы необходимо включать и исключать из
объектного файла единым блоком.
Группы разделов определяются с помощью раздела типа SHT_GROUP. Названием
группы разделов становится имя, заданное в таблице имен одного из разделов,
входящих в группу. Запись таблицы имен определяется заголовком раздела
SHT_GROUP; в элементе sh_link хранится индекс раздела с таблицей имен, в которой
хранится запись. Индекс самой записи таблицы имен хранится в элементе sh_info.
Элемент sh_flags заголовка раздела содержит значение 0. Имя раздела (sh_name) не
указывается.
В разделе SHT_GROUP хранится массив записей Elf32_Word. Первая запись - это
флаг. Остальные записи - это последовательность индексов заголовков разделов.
На данный момент определены следующие флаги:
Флаги группы разделов
Имя |
Значение |
GRP_COMDAT |
0x1
|
- GRP_COMDAT
- Это группа COMDAT. Ее название может совпадать с названием другой группы
COMDAT в другом объектном файле. В этом случае компоновщик обработает только
одну группу, а элементы другой группы будут отклонены.
Индексы заголовков разделов в SHT_GROUP указывают на разделы, из которых
состоит группа. В элементе sh_flags каждой из этих групп должен быть задан флаг
SHF_GROUP. Если компоновщику потребуется удалить группу разделов, он удаляет все
входящие в группу разделы.
Примечание: Это требование не относится к случаю удаления отладочной
информации. При удалении такой информации сегмент, для которого выполняется
отладка, не удаляется вместе с отладочным сегментом, даже если они относятся к
одной группе.
Для того чтобы группу можно было удалить, не затрагивая таблицы имен и не
нарушая установленные ссылки, должны соблюдаться следующие правила:
- Ссылки на разделы, входящие в группу, из разделов, не входящих в группу,
должны реализовываться с помощью записей таблицы имен с атрибутами STB_GLOBAL
или STB_WEAK и индексом раздела SHN_UNDEF. Если в объекте, ссылающемся на
раздел группы, переопределяется имя из группы, то для такого имени должна быть
создана отдельная запись в таблице имен. Внешние разделы не могут ссылаться на
имена с атрибутом STB_LOCAL для адресов, содержащихся в разделах группы,
включая имена типа STT_SECTION.
- Никакие другие ссылки на разделы, входящие в группу, кроме ссылок на
имена, применять нельзя. Например, нельзя использовать индекс заголовка
раздела, входящего в группу, в элементе sh_link или sh_info.
- Запись таблицы имен, определенная для одного из разделов группы и
содержащаяся в разделе таблицы имен, должна быть удалена при удалении
элементов группы.
Некоторые разделы содержат управляющую и программную информацию.
Ниже перечислены типы и атрибуты таких разделов.
Специальные разделы
Имя |
Тип |
Атрибуты |
.bss |
SHT_NOBITS |
SHF_ALLOC+SHF_WRITE |
.comment |
SHT_PROGBITS |
нет |
.data |
SHT_PROGBITS |
SHF_ALLOC+SHF_WRITE |
.data1 |
SHT_PROGBITS |
SHF_ALLOC+SHF_WRITE |
.debug |
SHT_PROGBITS |
нет |
.dynamic |
SHT_DYNAMIC |
см. ниже |
.dynstr |
SHT_STRTAB |
SHF_ALLOC |
.dynsym |
SHT_DYNSYM |
SHF_ALLOC |
.fini |
SHT_PROGBITS |
SHF_ALLOC+SHF_EXECINSTR |
.fini_array |
SHT_FINI_ARRAY
|
SHF_ALLOC+SHF_WRITE |
.got |
SHT_PROGBITS |
см. ниже |
.hash |
SHT_HASH |
SHF_ALLOC |
.init |
SHT_PROGBITS |
SHF_ALLOC+SHF_EXECINSTR |
.init_array |
SHT_INIT_ARRAY
|
SHF_ALLOC+SHF_WRITE |
.interp |
SHT_PROGBITS |
см. ниже |
.line |
SHT_PROGBITS |
нет |
.note |
SHT_NOTE |
нет |
.plt |
SHT_PROGBITS |
см. ниже |
.preinit_array
|
SHT_PREINIT_ARRAY |
SHF_ALLOC+SHF_WRITE |
.relимя
|
SHT_REL |
см. ниже |
.relaимя
|
SHT_RELA |
см. ниже |
.rodata |
SHT_PROGBITS |
SHF_ALLOC |
.rodata1 |
SHT_PROGBITS |
SHF_ALLOC |
.shstrtab |
SHT_STRTAB |
нет |
.strtab |
SHT_STRTAB |
см. ниже |
.symtab |
SHT_SYMTAB |
см. ниже |
.text |
SHT_PROGBITS |
SHF_ALLOC+SHF_EXECINSTR |
- .bss
- В этом разделе хранятся неинициализированные данные, относящиеся к образу
памяти в программе. По определению, система инициализирует данные нулями при
запуске программы. Как следует из типа раздела (SHT_NOBITS), он не
занимает места в памяти.
- .comment
- В этом разделе хранится информация о версии.
- .data и .data1
- В этом разделе хранятся инициализированные данные, относящиеся к образу
памяти в программе.
- .debug
- В этом разделе хранится информация для отладки имен. Формат его
содержимого не определен. Все разделы с именами, начинающимися с
.debug, зарезервированы в ABI для использования в будущем.
- .dynamic
- В этом разделе хранится информация о динамической компоновке. Атрибуты
раздела содержат бит SHF_ALLOC. Значение бита SHF_WRITE зависит
от процессора. Более подробная информация приведена в главе 32.
- .dynstr
- В этом разделе хранится информация, применяемая при динамической
компоновке. Чаще всего это имена, связанные с записями таблицы имен. Более
подробная информация приведена в главе 32.
- .dynsym
- В этом разделе хранится таблица имен для динамической компоновки (см.
раздел Таблица
имен.) Более подробная информация приведена в главе 32.
- .fini
- В этом разделе хранятся исполняемые инструкции, относящиеся к функциям
завершения процесса. При нормальном завершении программы система выполняет
инструкции из этого раздела.
- .fini_array
- В этом разделе хранится массив указателей на функции завершения для
исполняемых и общих объектов, содержащих раздел.
- .got
- В этом разделе хранится глобальная таблица смещения. Более подробная
информация приведена в разделах "Примеры кода", "Специальные разделы" и
"Глобальная таблица смещения" в главе 32.
- .hash
- В этом разделе хранится хэш-таблица имен. Более подробная информация
приведена в разделе Хэш-таблица
в главе 32.
- .init
- В этом разделе хранятся исполняемые инструкции, относящиеся к функциям
инициализации процесса. При запуске программы система выполняет инструкции из
этого раздела перед передачей управления главной точке входа программы
(называемой в языке С функцией main).
- .init_array
- В этом разделе хранится массив указателей на функции инициализации для
исполняемых и общих объектов, содержащих раздел.
- .interp
- В этом разделе хранится путь к интерпретатору программы. Если в файле есть
загружаемый сегмент, требующий перемещения, то атрибуты раздела будут
содержать бит SHF_ALLOC. В противном случае, этот бит будет выключен.
Более подробная информация приведена в главе 32.
- .line
- В этом разделе хранится отладочная информация о номере строки,
устанавливающая соответствие между исходной программой и машинным кодом.
Формат его содержимого не определен.
- .note
- В этом разделе хранится информация в формате, описанном в главе 32. См.
раздел Раздел
примечаний.
- .plt
- В этом разделе хранится таблица компоновки процедур. Более подробная
информация приведена в разделах "Специальные разделы" и "Таблица компоновки
процедур" в главе 32.
- .preinit_array
- В этом разделе хранится массив указателей на функции предварительной
инициализации для исполняемых и общих объектов, содержащих раздел.
- .relимя и .relaимя
- В этих разделах хранится информация о перемещении, описанная в разделе Перемещение.
Если в файле есть загружаемый сегмент, требующий перемещения, то атрибуты
раздела будут содержать бит SHF_ALLOC. В противном случае, этот бит
будет выключен. Значение имени определяется разделом, в котором
выполняется перемещение. Таким образом, разделу перемещения для .text
обычно присваивается имя .rel.text или .rela.text.
- .rodata и .rodata1
- В этих разделах хранятся предназначенные только для чтения данные,
относящиеся к защищенному от записи сегменту образа процесса. Более подробная
информация приведена в разделе Заголовок
программы в главе 32.
- .shstrtab
- В этом разделе хранятся имена разделов.
- .strtab
- В этом разделе хранятся строки, которые представляют собой имена,
связанные с записями таблицы имен. Если в файле есть загружаемый сегмент с
таблицей имен, то атрибуты раздела будут содержать бит SHF_ALLOC. В
противном случае, этот бит будет выключен.
- .symtab
- В этом разделе хранится таблица имен, описанная в разделе Таблица
имен этой главы. Если в файле есть загружаемый сегмент с таблицей имен, то
атрибуты раздела будут содержать бит SHF_ALLOC. В противном случае,
этот бит будет выключен.
- .text
- В этом разделе хранится текст (исполняемые инструкции) программы.
Имена разделов, начинающиеся с точки (.), зарезервированы системой,
однако приложения могут при необходимости пользоваться этими разделами. Для того
чтобы избежать конфликтов с системными разделами, в приложениях рекомендуется
использовать имена, не начинающиеся с точки. Формат объектного файла позволяет
определять разделы, не показанные в предыдущем списке. В объектном файле может
быть несколько разделов с одинаковыми именами.
Имена разделов, зарезервированные для конкретной процессорной архитектуры,
создаются путем добавления к имени раздела префикса, соответствующего заданной
архитектуре. Названия архитектур должны совпадать с названиями, определенными
для e_machine. Например, .FOO.psect - это раздел
psect, определенный для архитектуры FOO.
Названия существующих расширений сложились исторически.
Табл. 32-1.
Стандартные расширения
.sdata |
.tdesc |
.sbss |
.lit4 |
.lit8 |
.reginfo |
.gptab |
.liblist |
.conflict
|
Примечание: Более подробная информация о разделах, зависящих от
конкретного процессора, приведена в документации ABI по процессору.
[
Страница
назад | Страница
вперед | Содержание
| Индекс
| Библиотека | Юридическая
информация | Поиск ]