Provided by: manpages-ru_4.18.1-1_all bug

ИМЯ

       elf - формат исполняемых и компонуемых файлов (ELF)

СИНТАКСИС

       #include <elf.h>

ОПИСАНИЕ

       В заголовочном файле <elf.h> определён формат ELF для исполняемых двоичных файлов. К таким
       файлам относятся обычные исполняемые файлы, перемещаемые  объектные  файлы,  core-файлы  и
       общие объекты.

       Исполняемый  файл в формате ELF состоит из заголовка ELF, таблицы заголовков программы или
       таблицы заголовков разделов (или обеих таблиц). Заголовок ELF всегда расположен  в  начале
       файла.  Расположение таблицы заголовков программы и таблицы заголовков разделов задаётся в
       заголовке ELF. В этих двух таблицах описывается всё остальное содержимое файла.

       Данный заголовочный файл описывает вышеупомянутые заголовки в виде  структур  C,  а  также
       включает описание структур динамических разделов, разделов перемещений и таблиц символов.

   Базовые типы
       Для  каждой  N-битной  архитектуры  используются  следующие типы (N=32,64; ElfN может быть
       Elf32 или Elf64; uintN_t может быть uint32_t или uint64_t):

           ElfN_Addr       Беззнаковый адрес программы, uintN_t
           ElfN_Off        Беззнаковое смещение в файле, uintN_t
           ElfN_Section    Беззнаковый индекс раздела, uint16_t
           ElfN_Versym     Беззнаковые данные о версии символа, uint16_t
           Elf_Byte        unsigned char
           ElfN_Half       uint16_t
           ElfN_Sword      int32_t
           ElfN_Word       uint32_t
           ElfN_Sxword     int64_t
           ElfN_Xword      uint64_t

       (Замечание: В *BSD используется немного другая терминология. Так, Elf64_Half  —  удвоенный
       Elf32_Half,  а  Elf64Quarteruint16_t. Чтобы не путаться, далее эти типы заменены на их
       явные типы.)

       Все структуры данных этого формата файлов  следуют  «естественному»  размеру  и  принципам
       выравнивания  соответствующего  класса.  Если  требуется,  структуры  данных содержат явно
       указанные заполнители (padding) для выравнивания по 4-м байтам  для  4-байтовых  объектов,
       для доведения размера структур до кратного 4-м и т. д.

   Заголовок ELF (Ehdr)
       Заголовок ELF описывается типом Elf32_Ehdr или Elf64_Ehdr:

           #define EI_NIDENT 16

           typedef struct {
               unsigned char e_ident[EI_NIDENT];
               uint16_t      e_type;
               uint16_t      e_machine;
               uint32_t      e_version;
               ElfN_Addr     e_entry;
               ElfN_Off      e_phoff;
               ElfN_Off      e_shoff;
               uint32_t      e_flags;
               uint16_t      e_ehsize;
               uint16_t      e_phentsize;
               uint16_t      e_phnum;
               uint16_t      e_shentsize;
               uint16_t      e_shnum;
               uint16_t      e_shstrndx;
           } ElfN_Ehdr;

       Значения полей:

       e_ident
              Массив  байт,  описывающий как воспринимать файл, не зависит от типа процессора или
              остального содержимого файла. Всё в массиве описывается макросами, начинающимися  с
              префикса EI_, которые могут иметь значения, начинающиеся с префикса ELF. Определены
              следующие макросы:

              EI_MAG0
                     Первый байт отличительного (magic) числа. Должен быть заполнен ELFMAG0.  (0:
                     0x7f)

              EI_MAG1
                     The  second  byte of the magic number.  It must be filled with ELFMAG1.  (1:
                     'E')

              EI_MAG2
                     The third byte of the magic number.  It must be filled  with  ELFMAG2.   (2:
                     'L')

              EI_MAG3
                     The  fourth  byte of the magic number.  It must be filled with ELFMAG3.  (3:
                     'F')

              EI_CLASS
                     В пятом байте задаётся архитектура двоичного файла:

                     ELFCLASSNONE  Неправильный класс.
                     ELFCLASS32    32-битная  архитектура.  Поддерживаются  машины  с  файлами  и
                                   виртуальным адресным пространством до 4 гигабайт.
                     ELFCLASS64    64-битная архитектура.

              EI_DATA
                     В  шестом  байте задаётся порядок кодирования данных в файле, используемый в
                     процессоре. В настоящее время поддерживаются:

                       ELFDATANONE   Неизвестный формат данных.
                       ELFDATA2LSB   Обратный порядок байт (little-endian) в дополнительном коде.
                       ELFDATA2MSB   Прямой порядок байт (big-endian) в дополнительном коде.

              EI_VERSION
                     В седьмом байте указывается номер версии спецификации ELF:

                     EV_NONE       Неправильный номер версии.
                     EV_CURRENT    Текущая версия.

              EI_OSABI
                     В восьмом байте указывается тип операционной системы и двоичного  интерфейса
                     приложений  (ABI),  для которой предназначен объект. Некоторые поля в других
                     структурах ELF имеют флаги и значения, зависящие от платформы; интерпретация
                     таких полей определяется значением данного байта. Пример:

                     ELFOSABI_NONE        Тоже что и ELFOSABI_SYSV.
                     ELFOSABI_SYSV        UNIX System V ABI
                     ELFOSABI_HPUX        HP-UX ABI
                     ELFOSABI_NETBSD      NetBSD ABI
                     ELFOSABI_LINUX       Linux ABI
                     ELFOSABI_SOLARIS     Solaris ABI
                     ELFOSABI_IRIX        IRIX ABI
                     ELFOSABI_FREEBSD     FreeBSD ABI
                     ELFOSABI_TRU64       TRU64 UNIX ABI
                     ELFOSABI_ARM         ABI архитектуры ARM
                     ELFOSABI_STANDALONE  Автономный (встраиваемый) ABI

              EI_ABIVERSION
                     В девятом байте указывается версия ABI, для которой предназначен объект. Это
                     поле используется для разграничения несовместимых версий ABI.  Интерпретация
                     данного  номера  версии  зависит  от  ABI,  указанного  в  поле  EI_OSABI. В
                     приложениях, удовлетворяющих данной спецификации, используется значение 0.

              EI_PAD Начало заполнителя. Эти байты  зарезервированы  и  устанавливаются  в  ноль.
                     Программы, читающие заголовок, должны игнорировать их. Значение EI_PAD будет
                     изменено, если понадобится  задействовать  неиспользуемые  в  данный  момент
                     байты.

              EI_NIDENT
                     Размер массива e_ident.

       e_type В этом поле структуры содержится тип объектного файла:

              ET_NONE         Неизвестный тип.
              ET_REL          Перемещаемый файл.
              ET_EXEC         Исполняемый файл.
              ET_DYN          Динамический объект.
              ET_CORE         Файл типа core.

       e_machine
              В этом поле содержится значение требуемой для файла архитектуры. Пример:

              EM_NONE         Неизвестная машинная архитектура
              EM_M32          AT&T WE 32100
              EM_SPARC        Sun Microsystems SPARC
              EM_386          Intel 80386
              EM_68K          Motorola 68000
              EM_88K          Motorola 88000
              EM_860          Intel 80860
              EM_MIPS         MIPS RS3000 (только с прямым порядком байт)
              EM_PARISC       HP/PA
              EM_SPARC32PLUS  SPARC с расширенным набором инструкций
              EM_PPC          PowerPC
              EM_PPC64        PowerPC, 64-битная
              EM_S390         IBM S/390.
              EM_ARM          Advanced RISC Machines.
              EM_SH           Renesas SuperH.
              EM_SPARCV9      SPARC v9, 64-битная
              EM_IA_64        Intel Itanium.
              EM_X86_64       AMD x86-64.
              EM_VAX          DEC Vax

       e_version
              В этом поле содержится версия файла:

              EV_NONE         Неправильный номер версии
              EV_CURRENT      Текущая версия

       e_entry
              В  этом  поле  содержится  виртуальный  адрес,  по которому система должна передать
              управление для запуска процесса. Если в файле нет такой точки  входа,  то  значение
              поля равно 0.

       e_phoff
              В этом поле содержится файловое смещение в байтах для таблицы заголовков программы.
              Если в файле нет таблицы заголовков программы, то значение поля равно 0.

       e_shoff
              В этом поле содержится файловое смещение в байтах для таблицы заголовков  разделов.
              Если в файле нет таблицы заголовков разделов, то значение поля равно 0.

       e_flags
              В этом поле содержатся специфичные для процессора флаги, относящиеся к файлу. Имена
              флагов  имеют  вид:   EF_машинный_флаг.   В   настоящее   время   нет   ни   одного
              предопределённого флага.

       e_ehsize
              В этом поле содержится размер заголовка ELF в байтах.

       e_phentsize
              В этом поле содержится размер в байтах одного элемента таблицы заголовков программы
              в файле; все элементы имеют одинаковый размер.

       e_phnum
              В этом поле содержится количество элементов в таблице заголовков  программы.  Таким
              образом,  произведение  e_phentsize  и e_phnum даёт размер таблицы в байтах. Если в
              файле нет заголовков программы, то e_phnum содержит 0.

              Если количество элементов в таблице заголовков программы больше или  равно  PN_XNUM
              (0xffff),  это  поле   содержит  значение  PN_XNUM  (0xffff)  и реальное количество
              элементов таблицы заголовков программы хранится в поле sh_info начального  элемента
              таблицы заголовков разделов. Иначе поле sh_info начального элемента содержит ноль.

              PN_XNUM
                     Имеет  значение  0xffff,  самое  большое  количество,  которое  может  иметь
                     e_phnum,  показывает,  где  расположено   реальное   количество   заголовков
                     программы.

       e_shentsize
              В этом поле содержится размер в байтах одного элемента таблицы заголовков разделов;
              все элементы имеют одинаковый размер.

       e_shnum
              В этом поле содержится количество элементов в таблице  заголовков  разделов.  Таким
              образом,  произведение e_shentsize и e_shnum даёт размер таблицы разделов в байтах.
              Если в файле нет заголовков разделов, то e_shnum содержит 0.

              Если  количество  элементов  в  таблице  заголовков  разделов  больше   или   равно
              SHN_LORESERVE  (0xff00),  то значение e_shnum равно и реальное количество элементов
              таблицы заголовков разделов хранится в поле  sh_size  начального  элемента  таблицы
              заголовков  разделов.  Иначе  поле  sh_size  начального элемента таблицы заголовков
              разделов имеет значение ноль.

       e_shstrndx
              В этом поле содержится индекс элемента в таблице заголовков  разделов,  указывающий
              на строковую таблицу названий разделов. Если в файле нет строковой таблицы названий
              разделов, то это поле содержит значение SHN_UNDEF.

              Если индекс строки имён разделов в таблице разделов больше или равен  SHN_LORESERVE
              (0xff00),  то в этом поле содержится значение SHN_XINDEX (0xffff) и реальный индекс
              строки имён разделов в таблице разделов хранится в поле sh_link начального элемента
              таблицы  заголовков  разделов.  Иначе  поле  sh_link  начального  элемента  таблицы
              заголовков разделов имеет значение ноль.

   Заголовок программы (Phdr)
       Таблица заголовков программы исполняемого или  совместно  используемого  объектного  файла
       представляет  собой  массив  структур,  каждая  из  которых описывает сегмент или содержит
       другую информацию, необходимую системе для  подготовки  программы  к  выполнению.  Сегмент
       объектного  файла  содержит  один или более разделов. Заголовки программы нужны только для
       исполняемых  и  совместно  используемых  объектных  файлов.  Размер  заголовков  программы
       указывается в файле в заголовке ELF в полях e_phentsize и e_phnum. Заголовок программы ELF
       описывается типом Elf32_Phdr или Elf64_Phdr, в зависимости от архитектуры:

           typedef struct {
               uint32_t   p_type;
               Elf32_Off  p_offset;
               Elf32_Addr p_vaddr;
               Elf32_Addr p_paddr;
               uint32_t   p_filesz;
               uint32_t   p_memsz;
               uint32_t   p_flags;
               uint32_t   p_align;
           } Elf32_Phdr;

           typedef struct {
               uint32_t   p_type;
               uint32_t   p_flags;
               Elf64_Off  p_offset;
               Elf64_Addr p_vaddr;
               Elf64_Addr p_paddr;
               uint64_t   p_filesz;
               uint64_t   p_memsz;
               uint64_t   p_align;
           } Elf64_Phdr;

       Основным отличием между 32-битным и 64-битным программным заголовком в структуре  является
       расположение поля p_flags.

       p_type Это  поле  структуры  определяет, какой тип сегмента описывает этот элемент массива
              или как воспринимать информацию данного элемента массива.

                 PT_NULL
                        Элемент массива не используется и значения других  полей  не  определены.
                        Это позволяет иметь в заголовке программы игнорируемые элементы.

                 PT_LOAD
                        Элемент  массива  определяет  загружаемый сегмент, описываемый p_filesz и
                        p_memsz. Байты из файла  проецируются  в  начало  сегмента  памяти.  Если
                        размер  сегмента  памяти  p_memsz  больше  чем  размер файла p_filesz, то
                        определяются  "дополнительные"  байты,  содержащие  значение  0,   и   их
                        располагают  за  инициализированной  областью  сегмента.  Размер файла не
                        может быть  больше  размера  памяти.  Элементы  загружаемых  сегментов  в
                        таблице  заголовков  программы  располагаются  в  порядке возрастания, их
                        сортируют по полю p_vaddr.

                 PT_DYNAMIC
                        Элемент  массива  указывает  на  данные  с  информацией  по  динамической
                        компоновке.

                 PT_INTERP
                        Элемент  массива  указывает  на  данные  о  расположении  и  размере пути
                        (завершается null) вызываемого интерпретатора. Этот  тип  сегмента  имеет
                        смысл  только  для  исполняемых  файлов (хотя может быть и в динамических
                        объектных файлах). Однако, в файле он не может указываться  более  одного
                        раза.  Если  он  задан,  то  должен  находиться  перед  всеми  элементами
                        загружаемых сегментов.

                 PT_NOTE
                        Элемент массива указывает на расположение заметок (ElfN_Nhdr).

                 PT_SHLIB
                        Данный тип сегмента зарезервирован, но  имеет  неопределённую  семантику.
                        Программы,  в  которых есть элемент массива такого типа, не соответствуют
                        ABI.

                 PT_PHDR
                        Элемент массива, если есть, указывает  на  расположение  и  размер  самой
                        таблицы  заголовков  программы,  и в файле и в образе программы в памяти.
                        Данный тип сегмента не может встречаться в файле более одного раза. Кроме
                        того,  он  может  задаваться  только  если  таблица  заголовков программы
                        является частью образа программы в  памяти.  Если  он  задан,  то  должен
                        находиться до элементов загружаемых сегментов.

                 PT_LOPROC, PT_HIPROC
                        Значения из диапазона [PT_LOPROC, PT_HIPROC] (не включая) зарезервированы
                        для процессорно-ориентированной семантики.

                 PT_GNU_STACK
                        Расширение GNU, используемое ядром Linux для управления состоянием  стека
                        через флаги, настраивается в поле p_flags.

       p_offset
              Это  поле  содержит смещение от начала файла, по которому располагается первый байт
              сегмента.

       p_vaddr
              Это поле содержит виртуальный адрес, по которому располагается первый байт сегмента
              в памяти.

       p_paddr
              В  системах,  для  которых важна физическая адресация, это поле зарезервировано для
              физического адреса сегмента. В BSD это поле не используется  и  должно  быть  равно
              нулю.

       p_filesz
              В  этом  поле  содержится  число  байт занимаемое сегментом в файле. Оно может быть
              равно нулю.

       p_memsz
              В этом поле содержится число байт занимаемое сегментом в  памяти.  Оно  может  быть
              равно нулю.

       p_flags
              В этом поле содержится битовая маска флагов соответствующего сегмента:

              PF_X   Исполняемый сегмент.
              PF_W   Сегмент доступен для записи.
              PF_R   Сегмент доступен для чтения.

              Сегмента  кода (text segment) обычно имеет флаги PF_X и PF_R. Сегмент данных обычно
              имеет флаги PF_W и PF_R.

       p_align
              В этом поле содержится значение согласно которому сегменты выровнены в памяти  и  в
              файле.  У  загружаемых  сегментов  процесса значения p_vaddr и p_offset должны быть
              кратны размеру страницы.  Величины  ноль  и  один  означают,  что  выравнивание  не
              требуется.  В  противном  случае  значение p_align должно быть положительным числом
              кратным степени двойки, а значение p_vaddr должно быть  равно  p_offset  и  кратным
              p_align.

   Заголовок раздела (Shdr)
       По  таблице  заголовков  разделов  можно  найти  расположение  всех  разделов в файле. Она
       представляет собой массив структур Elf32_Shdr или Elf64_Shdr. На начало таблицы заголовков
       разделов  в  файле  указывает  поле e_shoff заголовка ELF (в байтах). В e_shnum содержится
       количество элементов таблицы заголовков разделов. В e_shentsize содержится размер  каждого
       элемента в байтах.

       Индекс  элемента  в таблице заголовков разделов указывает в этот массив. Некоторые индексы
       элемента в таблице заголовков разделов зарезервированы: начальный  элемент  и  индексы  от
       SHN_LORESERVE  и  до  SHN_HIRESERVE.  Начальный элемент используется в расширениях ELF для
       e_phnum, e_shnum and e_shstrndx; в других случаях, каждое поле начального  элемента  равно
       нулю. В объектном файле нет разделов с этими специальными индексами:

       SHN_UNDEF
              Этим  значением  помечается неопределённая, отсутствующая, неприменимая, или другая
              нецелесообразная ссылка на раздел.

       SHN_LORESERVE
              Это значение задаёт нижнюю границу диапазона зарезервированных индексов.

       SHN_LOPROC, SHN_HIPROC
              Значения, больше диапазона [PT_LOPROC,  PT_HIPROC]  (включительно)  зарезервированы
              для процессорно-ориентированной семантики.

       SHN_ABS
              Это  значение  указывает  на  абсолютное значение соответствующей ссылки. Например,
              символы, определённые относительно раздела  с  номером  SHN_ABS,  имеют  абсолютные
              значения и не подвержены перемещению.

       SHN_COMMON
              Символы,  определённые  относительно  такого  раздела,  являются  общими символами,
              такими как Fortran COMMON или нераспределённые внешние переменные C.

       SHN_HIRESERVE
              Этим значением определяется верхняя граница диапазона зарезервированных индексов. В
              системе зарезервированы индексы между SHN_LORESERVE и SHN_HIRESERVE включительно. В
              таблице заголовков разделов нет элементов с зарезервированными индексами.

       Заголовок раздела имеет следующую структуру:

           typedef struct {
               uint32_t   sh_name;
               uint32_t   sh_type;
               uint32_t   sh_flags;
               Elf32_Addr sh_addr;
               Elf32_Off  sh_offset;
               uint32_t   sh_size;
               uint32_t   sh_link;
               uint32_t   sh_info;
               uint32_t   sh_addralign;
               uint32_t   sh_entsize;
           } Elf32_Shdr;

           typedef struct {
               uint32_t   sh_name;
               uint32_t   sh_type;
               uint64_t   sh_flags;
               Elf64_Addr sh_addr;
               Elf64_Off  sh_offset;
               uint64_t   sh_size;
               uint32_t   sh_link;
               uint32_t   sh_info;
               uint64_t   sh_addralign;
               uint64_t   sh_entsize;
           } Elf64_Shdr;

       Существенной разницы между 32-битными и 64-битными заголовками разделов нет.

       sh_name
              В этом поле указывается название раздела. Его значением является индекс в строковой
              таблице заголовков разделов, дающий расположение строки, заканчивающейся null.

       sh_type
              В этом поле содержится тип содержимого раздела, определяющий смысл.

              SHT_NULL
                     Этим  значением  помечают  неактивные разделы в заголовке. У такого элемента
                     нет  привязанного  раздела.  Значения  других  полей  заголовка  раздела  не
                     определены.

              SHT_PROGBITS
                     Этот  раздел  содержит  информацию, задаваемую программой; её формат и смысл
                     полностью определяется программой.

              SHT_SYMTAB
                     В этом  разделе  содержится  таблица  символов.  Обычно,  раздел  SHT_SYMTAB
                     предоставляет   символы   для   редактирования   связей,  хотя  также  может
                     использоваться при динамической компоновке. Являясь полной таблицей символов
                     может содержать символы, не требуемые для динамической компоновки. Объектный
                     файл также может содержать раздел SHT_DYNSYM.

              SHT_STRTAB
                     В этом разделе содержится  таблица  строк.  В  объектном  файле  может  быть
                     несколько разделов с таблицами строк.

              SHT_RELA
                     В  этом  разделе  содержатся элементы перемещения с явными добавками, такими
                     как тип Elf32_Rela для 32-битного класса объектных  файлов.  Объектный  файл
                     может иметь несколько разделов перемещений.

              SHT_HASH
                     В  этом  разделе  содержится  хэш-таблица  символов.  Объект,  участвующий в
                     динамической компоновке, должен  иметь  хэш-таблицу  символов.  В  объектном
                     файле должна быть только одна хэш-таблица.

              SHT_DYNAMIC
                     В этом разделе содержится информация по динамической компоновке. В объектном
                     файле должен быть только один динамический раздел.

              SHT_NOTE
                     В этом разделе содержатся заметки (ElfN_Nhdr).

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

              SHT_REL
                     В этом разделе содержатся элементы перемещения без явных добавок, таких  как
                     тип  Elf32_Rela для 32-битного класса объектных файлов. Объектный файл может
                     иметь несколько разделов перемещений.

              SHT_SHLIB
                     Данный тип сегмента зарезервирован, но имеет неопределённую семантику.

              SHT_DYNSYM
                     В этом  разделе  содержится  минимальный  набор  символов  для  динамической
                     компоновки. В объектном файле также может быть раздел SHT_SYMTAB.

              SHT_LOPROC, SHT_HIPROC
                     Значения из диапазона SHT_LOPROC, SHT_HIPROC] (включительно) зарезервированы
                     для процессорно-ориентированной семантики.

              SHT_LOUSER
                     Это   значение   указывает   на   нижнюю   границу    диапазона    индексов,
                     зарезервированного для пользовательских программ.

              SHT_HIUSER
                     Это    значение    указывает   на   нижнюю   границу   диапазона   индексов,
                     зарезервированного для пользовательских программ. Разделы с типами, имеющими
                     значение между SHT_LOUSER и SHT_HIUSER, могут использоваться приложениями не
                     конфликтуя с имеющимися или будущими типами разделов, определяемых системой.

       sh_flags
              В этом поле указываются различные атрибуты раздела, задаваемые  в  виде  однобитных
              флагов.  Если  бит  флага  установлен в sh_flags, то атрибут "активен" для раздела.
              Иначе атрибут "выключен" или не применяется. Не указанные атрибуты  сбрасываются  в
              ноль.

              SHF_WRITE
                     В  разделе  содержатся данные, к которым при работе процесса нужен доступ на
                     запись.

              SHF_ALLOC
                     Этот раздел занимает  память  при  работе  процесса.  Некоторые  управляющие
                     разделы  не  располагаются  в  образе  памяти объектного файла. Этот атрибут
                     выключен у таких разделов.

              SHF_EXECINSTR
                     Этот раздел содержит исполняемые машинные инструкции.

              SHF_MASKPROC
                     Все  биты  этой  маски   зарезервированы   для   процессорно-ориентированной
                     семантики.

       sh_addr
              Если  этот  раздел появляется в образе памяти процесса, то это поле содержит адрес,
              по которому должен располагаться первый байт раздела. Иначе поле содержит ноль.

       sh_offset
              В этом поле содержится смещение в байтах от начала файла до первого байта  раздела.
              Раздел  типа  SHT_NOBITS  не  занимает  места в файле и его поле sh_offset содержит
              умозрительное размещение в файле.

       sh_size
              В этом поле содержится размер раздела в байтах.  За  исключением  раздела  с  типом
              SHT_NOBITS,  все  разделы  занимают sh_size байт в файле. Раздел с типом SHT_NOBITS
              может иметь ненулевой размер, но места в файле не занимает.

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

       sh_info
              В этом поле содержится дополнительная информация, чья интерпретация зависит от типа
              раздела.

       sh_addralign
              Некоторые разделы имеют требования по выравниванию адресов.  Если  раздел  содержит
              двойное  слово,  то  система должна произвести выравнивание по двойному слову всего
              раздела. То есть, значение sh_addr должно быть таким, чтобы при делении  по  модулю
              sh_addralign  получался ноль. Разрешены только ноль и положительные степени двойки.
              Значение 0 или 1 означают, что раздел не имеет требований по выравниванию.

       sh_entsize
              В некоторых разделах содержатся таблицы с элементами одинакового размера, например,
              таблица  символов.  Для  таких  разделов  в данном поле указывается размер в байтах
              каждого элемента. Если раздел содержит таблицу с элементами разного размера, то это
              поле равно нулю.

       Программа и управляющая информация содержится в различных разделах:

       .bss   В  этом  разделе  содержатся  неинициализированные данные, которые вносятся в образ
              программы  в  памяти.  По  определению,  в  начале  выполнения  программы   система
              инициализирует  эти  данные  нулями.  Этот  раздел  имеет тип SHT_NOBITS и атрибуты
              SHF_ALLOC и SHF_WRITE.

       .comment
              В  этом  разделе  содержится  управляющая  информация  о  версии.  Он   имеет   тип
              SHT_PROGBITS и не имеет атрибутов.

       .ctors В  этом  разделе содержатся инициализированные указатели функций-конструкторов C++.
              Он имеет тип SHT_PROGBITS и атрибуты SHF_ALLOC и SHF_WRITE.

       .data  В этом разделе содержатся  инициализированные  данные,  которые  вносятся  в  образ
              программы в памяти. Он имеет тип SHT_PROGBITS и атрибуты SHF_ALLOC и SHF_WRITE.

       .data1 В  этом  разделе  содержатся  инициализированные  данные,  которые вносятся в образ
              программы в памяти. Он имеет тип SHT_PROGBITS и атрибуты SHF_ALLOC и SHF_WRITE.

       .debug В этом разделе содержится информация для символьной отладки. Формат содержимого  не
              определён. Этот раздел имеет тип SHT_PROGBITS и не имеет атрибутов.

       .dtors В этом разделе содержатся инициализированные указатели функций-деструкторов C++. Он
              имеет тип SHT_PROGBITS и атрибуты SHF_ALLOC и SHF_WRITE.

       .dynamic
              В этом разделе содержится информация о динамической компоновке. К атрибутам раздела
              будет добавлен бит SHF_ALLOC. В зависимости от процессора может быть установлен бит
              SHF_WRITE. Этот раздел имеет тип SHT_DYNAMIC.

       .dynstr
              В этом разделе содержатся строки, необходимые  для  динамической  компоновки;  чаще
              всего  это  строки,  представляющие имена, связанные с элементами таблицы символов.
              Этот раздел имеет тип SHT_STRTAB и атрибут SHF_ALLOC.

       .dynsym
              В этом разделе содержится таблица символов для динамической компоновки. Этот раздел
              имеет тип SHT_DYNSYM и атрибут SHF_ALLOC.

       .fini  В этом разделе содержатся исполняемые инструкции, которые вносятся в код завершения
              процесса. При нормальном завершении программы система передаёт выполнение  коду  из
              этого   раздела.  Этот  раздел  имеет  тип  SHT_PROGBITS  и  атрибуты  SHF_ALLOC  и
              SHF_EXECINSTR.

       .gnu.version
              В этом разделе содержится таблица  версий  символов,  массив  элементов  ElfN_Half.
              Данный раздел имеет тип SHT_GNU_versym и атрибут SHF_ALLOC.

       .gnu.version_d
              В   этом   разделе   содержатся   определения  версий  символов,  таблица  структур
              ElfN_Verdef. Данный раздел имеет тип SHT_GNU_verdef и атрибут SHF_ALLOC.

       .gnu.version_r
              В этом разделе содержатся версии символов необходимых элементов,  таблица  структур
              ElfN_Verneed. Данный раздел имеет тип SHT_GNU_versym и атрибут SHF_ALLOC.

       .got   В   этом   разделе   содержится   таблица  глобальных  перемещений.  Он  имеет  тип
              SHT_PROGBITS. Набор используемых атрибутов зависит от процессора.

       .hash  В этом разделе содержится хэш-таблица символов. Он имеет  тип  SHT_HASH  и  атрибут
              SHF_ALLOC.

       .init  В   этом   разделе  содержатся  исполняемые  инструкции,  которые  вносятся  в  код
              инициализации процесса. Когда программа запускается,  система  передаёт  выполнение
              коду  из  этого  раздела  до  вызова  основной  программы.  Данный раздел имеет тип
              SHT_PROGBITS и атрибуты SHF_ALLOC и SHF_EXECINSTR.

       .interp
              В этом  разделе  содержится  путь  к  интерпретатору  программы.  Если  файл  имеет
              загружаемый  сегмент, который включает раздел, то в атрибуты раздела будет добавлен
              бит SHF_ALLOC. Иначе этот бит будет обнулён. Данный раздел имеет тип SHT_PROGBITS.

       .line  В этом разделе содержатся  информация  о  номерах  строк  для  символьной  отладки,
              которая  описывает  соответствие  между  исходным кодом программы и машинным кодом.
              Формат содержимого не определён. Данный раздел имеет тип SHT_PROGBITS  и  не  имеет
              атрибутов.

       .note  В  этом разделе содержатся различные заметки. Он имеет тип SHT_NOTE. Типы атрибутов
              атрибутов не используются.

       .note.ABI-tag
              Этот раздел используется для объявления  ожидаемой  образом  ELF  среды  выполнения
              (run-time)  ABI. Здесь может указываться имя операционной системы и её версии среды
              выполнения.  Данный  раздел  имеет  тип  SHT_NOTE.  Используется   только   атрибут
              SHF_ALLOC.

       .note.gnu.build-id
              Данный  раздел  используется  для  хранения  ID,  который  уникально  отождествляет
              содержимое образа ELF.  Разные  файлы  с  одинаковым  ID  сборки  должны  содержать
              одинаковое   исполняемого  содержимое.  Подробней  смотрите  в  описании  параметра
              --build-id  компоновщика  GNU  (ld  (1)).  Данный  раздел   имеет   тип   SHT_NOTE.
              Используется только атрибут SHF_ALLOC.

       .note.GNU-stack
              Этот  раздел  используется в объектных файлах Linux для объявления атрибутов стека.
              Данный раздел имеет тип  SHT_PROGBITS  и  единственный  атрибут  SHF_EXECINSTR.  Он
              указывает  компоновщику  GNU  на  необходимость  объектного файла иметь исполняемый
              стек.

       .note.openbsd.ident
              Обычно, этот раздел содержится а собственных  исполняемых  файлах  OpenBSD  для  их
              идентификации,  что  используется  ядром для пропуска тестирования на необходимость
              эмуляции двоичных файлов ELF при загрузке файла.

       .plt   В этом разделе содержится таблица компоновки процедур. Он имеет  тип  SHT_PROGBITS.
              Набор используемых атрибутов зависит от процессора.

       .relИМЯ
              В  этом  разделе содержится информация о перемещениях, описываемая далее. Если файл
              имеет загружаемый сегмент, включающий перемещение, то в атрибуты раздела  добавится
              бит  SHF_ALLOC.  Иначе  этот  бит  будет обнулён. По соглашению, «ИМЯ» указывает на
              раздел, к которому применяются перемещения. То есть раздел  перемещений  для  .text
              обычно называется .rel.text. Данный раздел имеет тип SHT_REL.

       .relaNAME
              В  этом  разделе содержится информация о перемещениях, описываемая далее. Если файл
              имеет загружаемый сегмент, включающий перемещение, то в атрибуты раздела  добавится
              бит  SHF_ALLOC.  Иначе  этот  бит  будет обнулён. По соглашению, «ИМЯ» указывает на
              раздел, к которому применяются перемещения. То есть раздел  перемещений  для  .text
              обычно называется .rela.text. Данный раздел имеет тип SHT_RELA.

       .rodata
              В  этом  разделе  содержатся  данные,  доступные  только для чтения, которые обычно
              вносятся в недоступный для записи сегмент образа процесса. Этот  раздел  имеет  тип
              SHT_PROGBITS и атрибут SHF_ALLOC.

       .rodata1
              В  этом  разделе  содержатся  данные,  доступные  только для чтения, которые обычно
              вносятся в недоступный для записи сегмент образа процесса. Этот  раздел  имеет  тип
              SHT_PROGBITS и атрибут SHF_ALLOC.

       .shstrtab
              В  этом  разделе  содержатся  имена  разделов.  Он  имеет тип SHT_STRTAB и не имеет
              атрибутов.

       .strtab
              В этом разделе содержатся строки, чаще  всего  представляющие  имена,  связанные  с
              элементами  таблицы символов. Если файл имеет загружаемый сегмент, который включает
              таблицу строк символов, то к разделу атрибутов будет добавлен бит SHF_ALLOC.  Иначе
              этот бит будет обнулён. Данный раздел имеет тип SHT_STRTAB.

       .symtab
              В  этом  разделе  содержится таблица символов. Если файл имеет загружаемый сегмент,
              который включает таблицу символов,  то  к  разделу  атрибутов  будет  добавлен  бит
              SHF_ALLOC. Иначе этот бит будет обнулён. Данный раздел имеет тип SHT_SYMTAB.

       .text  В  этом  разделе содержится "код (text)", то есть исполняемые инструкции программы.
              Он имеет тип SHT_PROGBITS и атрибуты SHF_ALLOC и SHF_EXECINSTR.

   Таблицы строк и символов
       String table sections hold null-terminated character sequences, commonly  called  strings.
       The  object file uses these strings to represent symbol and section names.  One references
       a string as an index into the string table section.  The first byte, which is index  zero,
       is  defined  to hold a null byte ('\0').  Similarly, a string table's last byte is defined
       to hold a null byte, ensuring null termination for all strings.

       В таблице символов объектного файла содержится информация, необходимая для  обнаружения  и
       перемещения  определённых в программе символов и ссылок. Индекс таблицы символов указывает
       на элемент из этого массива.

           typedef struct {
               uint32_t      st_name;
               Elf32_Addr    st_value;
               uint32_t      st_size;
               unsigned char st_info;
               unsigned char st_other;
               uint16_t      st_shndx;
           } Elf32_Sym;

           typedef struct {
               uint32_t      st_name;
               unsigned char st_info;
               unsigned char st_other;
               uint16_t      st_shndx;
               Elf64_Addr    st_value;
               uint64_t      st_size;
           } Elf64_Sym;

       32-битная и 64-битная версии имеют одинаковые поля, различен только их порядок.

       st_name
              В этом поле содержится индекс на элемент в таблице строк символов объектного файла,
              которая  содержит  символьное  представление  имён символов. Если значение не равно
              нулю, то это индекс таблицы строк, по  которому  определяется  имя  символа.  Иначе
              символ не имеет имени.

       st_value
              В этом поле содержится значение соответствующего символа.

       st_size
              Со  многими  символами  связываются  определённые  размеры. Это поле имеет значение
              ноль, если символ не имеет размера или его размер неизвестен.

       st_info
              В этом поле задаётся тип символа и атрибуты привязки:

              STT_NOTYPE
                     Тип символа не определён.

              STT_OBJECT
                     Символу соответствует объект данных.

              STT_FUNC
                     Символу соответствует функция или другой исполняемый код.

              STT_SECTION
                     Символу  соответствует  раздел.  Элементы  таблицы   символов   этого   типа
                     существуют, прежде всего, для перемещения и обычно имеют привязки STB_LOCAL.

              STT_FILE
                     По  соглашению,  имя символа назначается согласно имени файла исходного кода
                     для  соответствующего  объектного  файла.  Файловый  символ  имеет  привязки
                     STB_LOCAL,  его  индекс  раздела  SHN_ABS, и он предваряется другим символом
                     STB_LOCAL файла, если он есть.

              STT_LOPROC, STT_HIPROC
                     Значения    из    диапазона    [STT_LOPROC,    STT_HIPROC]    (включительно)
                     зарезервированы для процессорно-ориентированной семантики.

              STB_LOCAL
                     Локальные символы невидимы вне объектного файла, содержащего их определения.
                     Локальные символы с теми же именами могут существовать в  нескольких  файлах
                     не мешая друг другу.

              STB_GLOBAL
                     Глобальные  символы  видимы  во  всех  объектных  файлах  после объединения.
                     Определение глобального символа в одном файле будет разрешать неопределённую
                     ссылку в другом файле для того же символа.

              STB_WEAK
                     Слабые   символы   (weak  symbols)  похожи  на  глобальные  символы,  но  их
                     определения имеют меньший приоритет.

              STB_LOPROC, STB_HIPROC
                     Значения    из    диапазона    [STB_LOPROC,    STB_HIPROC]    (включительно)
                     зарезервированы для процессорно-ориентированной семантики.

              Макросы для упаковки и распаковки полей привязки и типа:

              ELF32_ST_BIND(info), ELF64_ST_BIND(info)
                     Извлекают привязку из значения st_info.

              ELF32_ST_TYPE(info), ELF64_ST_TYPE(info)
                     Извлекают тип из значения st_info.

              ELF32_ST_INFO(bind, type), ELF64_ST_INFO(bind, type)
                     Преобразуют привязку и тип в значение st_info.

       st_other
              Этим полем определяется видимость символа.

              STV_DEFAULT
                     Правила  видимости  символов  по  умолчанию.  Глобальные  и  слабые  символы
                     доступны в других  модулях;  ссылки  в  локальном  модуле  могут  помещаться
                     определениями в других модулях.
              STV_INTERNAL
                     Скрытый класс, зависящий от процессора.
              STV_HIDDEN
                     Символ  недоступен  в  других  модулях;  ссылки  в  локальном  модуле всегда
                     указывают  на  локальный  символ  (то  есть,  символ  не  может   помещаться
                     определениями в других модулях).
              STV_PROTECTED
                     Символ  доступен  в  других  модулях,  то  ссылки  в локальном модуле всегда
                     указывают на локальный символ.

              Эти макросы служат для извлечения типа видимости:

              ELF32_ST_VISIBILITY(other) или ELF64_ST_VISIBILITY(other)

       st_shndx
              Каждый элемент таблицы символов «определён» в отношении к некоторому  разделу.  Это
              поле содержит соответствующий индекс таблицы заголовков разделов.

   Элементы перемещений (Rel & Rela)
       Перемещение  —  это  процесс  соединения  символьных  ссылок  с символьными определениями.
       Перемещаемые файлы должны иметь  информацию,  которая  описывает  как  нужно  изменить  их
       содержимое разделов, чтобы позволить исполняемым и динамическим объектным файлам содержать
       корректную информацию для образа процесса программы. Для этого существуют перемещения.

       Перемещаемые структуры, которым не нужна добавка:

           typedef struct {
               Elf32_Addr r_offset;
               uint32_t   r_info;
           } Elf32_Rel;

           typedef struct {
               Elf64_Addr r_offset;
               uint64_t   r_info;
           } Elf64_Rel;

       Перемещаемые структуры, которым нужна добавка:

           typedef struct {
               Elf32_Addr r_offset;
               uint32_t   r_info;
               int32_t    r_addend;
           } Elf32_Rela;

           typedef struct {
               Elf64_Addr r_offset;
               uint64_t   r_info;
               int64_t    r_addend;
           } Elf64_Rela;

       r_offset
              В этом поле задаётся расположение, по которому применяется действие по перемещению.
              Для файла, допускающего перемещения, значением является байтовое смещение от начала
              раздела до хранимого элемента, подвергаемого перемещению.  Для  исполняемого  файла
              или  динамического объекта значением является виртуальный адрес хранимого элемента,
              подвергаемого перемещению.

       r_info В этом поле указывается индекс таблицы  символов  с  соблюдением  того,  что  нужно
              выполнить  перемещение  и тип применяемого перемещения. Типы перемещений зависят от
              архитектуры процессора. Когда в  коде  есть  ссылка  на  тип  перемещения  элемента
              перемещения  или  индекс  таблицы  символов, то имеется в виду результат применения
              ELF[32|64]_R_TYPE или ELF[32|64]_R_SYM, соответственно, к полю r_info.

       r_addend
              В этом поле указывается константа-добавка, используемая  для  вычисления  значения,
              хранимого в поле перемещения.

   Динамические метки (Dyn)
       В  разделе  .dynamic  содержится  несколько  структур,  в которых содержится информация по
       динамической компоновке. Полем d_tag контролируется интерпретация d_un.

           typedef struct {
               Elf32_Sword    d_tag;
               union {
                   Elf32_Word d_val;
                   Elf32_Addr d_ptr;
               } d_un;
           } Elf32_Dyn;
           extern Elf32_Dyn _DYNAMIC[];

           typedef struct {
               Elf64_Sxword    d_tag;
               union {
                   Elf64_Xword d_val;
                   Elf64_Addr  d_ptr;
               } d_un;
           } Elf64_Dyn;
           extern Elf64_Dyn _DYNAMIC[];

       d_tag  В этом поле могут содержаться следующие значения:

              DT_NULL     Этим значением помечается конец динамического раздела

              DT_NEEDED   Смещение в таблице строк на имя необходимой библиотеки

              DT_PLTRELSZ Размер в байтах элементов перемещений PLT

              DT_PLTGOT   Адрес PLT и/или GOT

              DT_HASH     Адрес хэш-таблицы символов

              DT_STRTAB   Адрес таблицы строк

              DT_SYMTAB   Адрес таблицы символов

              DT_RELA     Адрес таблицы перемещений Rela

              DT_RELASZ   Размер в байтах таблицы перемещений Rela

              DT_RELAENT  Размер в байтах элемента таблицы перемещений Rela

              DT_STRSZ    Размер в байтах таблицы строк

              DT_SYMENT   Размер в байтах элемента таблицы строк

              DT_INIT     Адрес функции инициализации

              DT_FINI     Адрес функции окончания

              DT_SONAME   Смещение в таблице строк для имени динамического объекта

              DT_RPATH    Смещение в таблице строк для пути поиска (устарело)

              DT_SYMBOLIC Уведомление для компоновщика, что нужно искать этот динамический объект
                          до поиска символов в исполняемом файле

              DT_REL      Адрес таблицы перемещений Rel

              DT_RELSZ    Размер в байтах таблицы перемещений Rel

              DT_RELENT   Размер в байтах элемента таблицы Rel

              DT_PLTREL   Тип элемента перемещения, на который ссылается PLT (Rela или Rel)

              DT_DEBUG    Не определено, используется для отладки

              DT_TEXTREL  Отсутствие   этого   элемента  указывает,  что  перемещения  не  должны
                          применяться к сегменту, недоступному на запись

              DT_JMPREL   Адрес элементов перемещений, связанных исключительно с PLT

              DT_BIND_NOW Указать  динамическому   компоновщику,   что   нужно   обработать   все
                          перемещения до передачи управления исполняемому файлу

              DT_RUNPATH  Смещение в таблице строк для пути поиска библиотек

              DT_LOPROC, DT_HIPROC
                          Значения    из    диапазона   [DT_LOPROC,   DT_HIPROC]   (включительно)
                          зарезервированы для процессорно-ориентированной семантики

       d_val  В этом поле указываются целые (integer) значения различного смысла.

       d_ptr  В этом поле указываются программные виртуальные адреса.  При  интерпретации  данных
              адресов,  реальные  адреса  должны  вычисляться на основе оригинального значения из
              файла и базового адреса  памяти.  Файлы  не  содержат  перемещаемых  элементов  для
              местоположения этих адресов.

       _DYNAMIC
              Массив,  содержащий  все  динамические  структуры в разделе .dynamic. Автоматически
              заполняется компоновщиком.

   Заметки (Nhdr)
       В заметки ELF можно добавлять произвольную  информацию  для  использования  в  системе.  В
       основном,  это  используется  в  файлах  core  (e_type  равно  ET_CORE), но многие проекты
       определяют свои собственные наборы расширений. Например, набор инструментов GNU использует
       заметки ELF для передачи информации компоновщика в библиотеку C.

       В  разделах  заметок  содержатся  последовательности  заметки (смотрите определение struct
       далее). Каждая заметка сопровождается полем имени (длина определяется в  n_namesz) и полем
       дескриптора (длина задаётся в n_descsz) и начинается с адреса, кратного 4 байтам. Оба поля
       не определены в структуре из-за их произвольной длины.

       Пример разбора двух последовательных заметок должен разъяснить их расположение в памяти:

           void *memory, *name, *desc;
           Elf64_Nhdr *note, *next_note;

           /* буфер, указывающий на начало раздела/сегмента. */
           note = memory;

           /* Если имя определено, то после него идёт заметка. */
           name = note->n_namesz == 0 ? NULL : memory + sizeof(*note);

           /* Если дескриптор определён, то за ним идёт имя
              (выровненное). */

           desc = note->n_descsz == 0 ? NULL :
                  memory + sizeof(*note) + ALIGN_UP(note->n_namesz, 4);

           /* Следующая заметка с обоими полями (с выравниванием). */
           next_note = memory + sizeof(*note) +
                                ALIGN_UP(note->n_namesz, 4) +
                                ALIGN_UP(note->n_descsz, 4);

       Следует иметь в виду, что интерпретация n_type зависит от пространства имён, определённого
       в  поле  n_namesz  field.  Если  поле  n_namesz не задано (например, равно 0), то есть два
       набора заметок: один для файлов core files и другой для всех  остальных  типов  ELF.  Если
       пространство  имён  неизвестно,  то инструменты, обычно, по умолчанию также используют эти
       наборы заметок.

           typedef struct {
               Elf32_Word n_namesz;
               Elf32_Word n_descsz;
               Elf32_Word n_type;
           } Elf32_Nhdr;

           typedef struct {
               Elf64_Word n_namesz;
               Elf64_Word n_descsz;
               Elf64_Word n_type;
           } Elf64_Nhdr;

       n_namesz
              Длина имени поля в  байтах.  Содержимое  идёт  в  памяти  сразу  за  заметкой.  Имя
              заканчивается null. Например, если имя «GNU», то n_namesz будет равно 4.

       n_descsz
              Длина дескриптора поля в байтах. Содержимое идёт в памяти сразу за именем поля.

       n_type В зависимости от значения имени поля, этот член может содержать следующие значения:

              Файлы core (e_type = ET_CORE)
                   Заметки  используются  всеми  файлами  core.  Их  формат  определяется  ОС или
                   архитектурой и часто требует  плотного  взаимодействия  ядра,  библиотек  C  и
                   отладчиков.  Они  используются  при  умолчательном  пространстве  имён (т. е.,
                   n_namesz равно 0) или когда пространство имён неизвестно.

                   NT_PRSTATUS          структура prstatus
                   NT_FPREGSET          структура fpregset
                   NT_PRPSINFO          структура prpsinfo
                   NT_PRXREG            структура prxregset
                   NT_TASKSTRUCT        структура задачи
                   NT_PLATFORM          Строка из sysinfo(SI_PLATFORM)
                   NT_AUXV              массив auxv
                   NT_GWINDOWS          структура gwindows
                   NT_ASRS              структура asrset
                   NT_PSTATUS           структура pstatus
                   NT_PSINFO            структура psinfo
                   NT_PRCRED            структура prcred
                   NT_UTSNAME           структура utsname
                   NT_LWPSTATUS         структура lwpstatus
                   NT_LWPSINFO          структура lwpinfo
                   NT_PRFPXREG          структура fprxregset
                   NT_SIGINFO           siginfo_t (в дальнейшем, размер может увеличиться)
                   NT_FILE              Содержит информацию об отображённых файлах
                   NT_PRXFPREG          user_fxsr_struct
                   NT_PPC_VMX           Регистры PowerPC Altivec/VMX
                   NT_PPC_SPE           Регистры PowerPC SPE/EVR
                   NT_PPC_VSX           Регистры PowerPC VSX
                   NT_386_TLS           слоты TLS в i386  (struct user_desc)
                   NT_386_IOPERM        битовая карта ввода-вывода в x86 (1=запрещено)
                   NT_X86_XSTATE        расширенное состояние x86, использующее xsave
                   NT_S390_HIGH_GPRS    верхние половинки регистров s390
                   NT_S390_TIMER        регистр таймера s390
                   NT_S390_TODCMP       регистр сравнивателя часов time-of-day (TOD) s390
                   NT_S390_TODPREG      программируемый регистр time-of-day (TOD) s390
                   NT_S390_CTRS         управляющие регистры s390
                   NT_S390_PREFIX       регистр префикса s390
                   NT_S390_LAST_BREAK   адрес прерывающего события s390
                   NT_S390_SYSTEM_CALL  данные системного вызова перезапуска s390
                   NT_S390_TDB          блок диагностики транзакции s390
                   NT_ARM_VFP           регистры VFP/NEON в ARM
                   NT_ARM_TLS           регистр TLS в ARM
                   NT_ARM_HW_BREAK      регистры аппаратного прерывания в ARM
                   NT_ARM_HW_WATCH      регистры аппаратного слежения в ARM
                   NT_ARM_SYSTEM_CALL   Номер системного вызова ARM

              n_name = GNU
                   Расширения, используемый инструментами GNU.

                   NT_GNU_ABI_TAG
                          Информация ABI операционной системы (OS). Поле дескриптора  содержит  4
                          слова:

                          [0]  OS descriptor (ELF_NOTE_OS_LINUX, ELF_NOTE_OS_GNU, and so on)`
                          [1]  major version of the ABI
                          [2]  minor version of the ABI
                          [3]  subminor version of the ABI

                   NT_GNU_HWCAP
                          Синтетическая информация hwcap. Поле дескриптора начинается 2 словами:

                          [0]  number of entries
                          [1]  bit mask of enabled entries

                          Далее  следуют  элементы  произвольной  длины  и один байт после строки
                          имени hwcap,  заканчивающейся  null.  В  байте  определён  номер  бита,
                          который  нужно  тестировать  для  проверки  включённости, (1U << бит) &
                          битовая маска.

                   NT_GNU_BUILD_ID
                          Уникальный идентификатор сборки, генерируемый GNU ld(1),  запущенной  с
                          параметром   --build-id.  Дескриптор  содержит  произвольное  ненулевое
                          количество байт.

                   NT_GNU_GOLD_VERSION
                          В поле дескриптора записывается использованная версия компоновщика  GNU
                          Gold.

              Умолчательное/неизвестное пространство имён (e_type != ET_CORE)
                   Они используются при умолчательном пространстве имён (т. е., n_namesz равно 0)
                   или когда пространство имён неизвестно.

                   NT_VERSION  Строка версии неопределённого вида
                   NT_ARCH     Информация об архитектуре

ЗАМЕЧАНИЯ

       Впервые ELF появился в System V. Формат ELF является утверждённым стандартом.

       Расширения для e_phnum, e_shnum и e_shstrndx соответствующих расширений Linux.  Также  они
       поддерживаются  в Sun, BSD и AMD64; дополнительную информацию смотрите в разделе "СМОТРИТЕ
       ТАКЖЕ".

СМ. ТАКЖЕ

       as(1), elfedit(1), gdb(1), ld(1), nm(1), objcopy(1), objdump(1), patchelf(1),  readelf(1),
       size(1), strings(1), strip(1), execve(2), dl_iterate_phdr(3), core(5), ld.so(8)

       Hewlett-Packard, Формат объектных файлов Elf-64.

       Santa Cruz Operation, Двоичный интерфейс приложений System V.

       UNIX  System  Laboratories,  «Объектные  файлы»,  Формат  исполняемых и компонуемых файлов
       (ELF).

       Sun Microsystems, Руководстве по компоновщику и библиотекам (Linker and Libraries Guide).

       черновик ABI AMD64, Дополнение к двоичному интерфейсу  приложений  System  V  процессорной
       архитектуры  AMD64  (System  V  Application  Binary Interface AMD64 Architecture Processor
       Supplement).

ПЕРЕВОД

       Русский   перевод   этой    страницы    руководства    был    сделан    Azamat    Hackimov
       <azamat.hackimov@gmail.com>,    Yuri    Kozlov    <yuray@komyakino.ru>   и   Иван   Павлов
       <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.