Elf файлов формат

В описанието на формата на типове данни, които да се използват [ф] intN_t. там където е знака на неподписани и N определя размера на типа, например, uint16_t. Тези видове са определени в стандарт файл заглавието stdint.h.

Всички типове данни и константи са описани в elf.h. заглавния файл

заглавния файл

В началото на файла (в компенсира 0 от началото) е ELF-заглавния файл описано със следната структура:

e_ident поле съдържа идентифицираща информация за файла. Невярно е масив от байтове да има същата производителност на различни архитектури и различен размер дума байт ред в думата. елементите на масива има следните функции:

В бъдеще ще предостави стойностите на константите на Linux на i386 архитектура. За постоянни стойности за други операционни системи и архитектури, вижте документацията.

област e_type идентифицира типа на файла: 0 (неизвестен), 1 (обектен файл), 2 (изпълним файл), 3 (общ библиотека), 4 (ядро-файл).

e_machine поле показва вида на процесор 0 (неизвестен), 3 (Intel 80386 и съвместими).

поле e_version идентифицира версия на файла: 0 (невалидна версия), 1 (текущата версия).

e_phoff поле определя отместването от началото на файла, преди таблицата с програмите хедър (заглавна програма таблицата). Информация за програмната схема с глава е дадена по-долу.

e_shoff поле определя отместването от началото на файла в началото на заглавието на раздел маса (програма раздел таблицата). Информация относно заглавията на масата секции ще бъдат дадени по-долу.

поле e_flags определя допълнителни процесорни специфични флагове. В момента стойността на това поле трябва винаги да бъде 0.

E_ehsize полеви магазини Размер на Header за ELF файлове. Неговата стойност е равна на 52 (sizeof (Elf32_Ehdr)).

E_phentsize поле съхранява размера на един запис в таблицата на програмни заглавки. Неговата стойност трябва да бъде 32 (sizeof (Elf32_Phdr)), или 0, ако таблицата с програмите заглавна е празен.

E_phnum поле съдържа броя на записите в таблицата на заглавната част на програмата.

E_shentsize поле съхранява размера на един запис в таблицата на челната част. Неговата стойност е равна на 40 (sizeof (Elf32_Shdr)), или 0, ако таблицата на раздел глава е празна.

E_shnum полеви магазини броя на записите в таблицата с челната част.

e_shstrndx раздел полеви удар с глава на магазини индекс, който съхранява имената на всички секции (см. по-долу).

раздел Таблица глава

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

раздел глава маса е масив от структури Elf32_Shdr. Броят на масив елементи се определя от полето e_shnum ELF-глава файл. Array с отместване съхранява в e_shoff област. На елемент от масива 0 е запазен и не се използва за описване секции. Така описания на секциите са в елементите на масив с индекси между 1 и e_shnum - 1.

Elf32_Shdr структура се определя, както следва:

sh_name поле съхранява индекса на името на раздела. име индекс - отместването в раздела за данни, чието индекс е уточнено в заглавния e_shstrndx за ELF файлове. На този офсет е поставен низ прекратява с нулев байт, който е на името на секцията.

По този начин, за да получите името на секцията от следните стъпки:

  • Изтеглете заглавието на раздел, индексът се съхранява в заглавния e_shstrndx за ELF файлове.
  • Качване на тялото, равняваща секция.
  • Чрез преместване в предварително определена площ памет относителна sh_name началото, който е зареден раздел се изисква от низ име точка.

Sh_type поле съхранява секцията тип. Възможните стойности на полето, са изброени по-долу.

Раздел съдържа инструкции процесор.

Знамена могат да бъдат комбинирани с побитови или.

sh_offset поле задържания отклонението от началото на файла, в съответствие с която се съхранява част от данните.

Невярно sh_size съхранява размера на участъка в байтове.

Sh_link полеви магазини индекс други раздели (в някои специални случаи).

Полеви sh_info магазини допълнителна информация секция.

Sh_entsize полеви складове с размерите на един запис, ако секцията съхранява таблица на записи с фиксиран размер.

програмни Таблица титли

Таблица заглавията на програмата съдържа необходимата информация за зареждане на програмата за изпълнение.

програма Таблица заглавията е масив от структури Elf32_Phdr. Масивът се поставя в компенсира от началото на файла, който се съхранява в областта на глава e_phoff ELF-файл, и броя на елементите масив съхранява в заглавната част e_phnum ELF-файл.

Elf32_Phdr структура се определя както следва.

поле P_type съхранява заглавието на тип. Някои от възможните видове колекторни стойности са дадени в таблицата по-долу.

p_offset поле задържания отклонението от началото на файла, който се намира на този сегмент.

P_paddr стойност поле трябва да бъде равна на 0.

P_filesz поле съхранява размер сегмент на даден файл (може да е 0).

Полеви p_memsz магазини в размер сегмент памет (може да е 0).

P_flags знамена полеви магазини достъпа до сегмента на памет (могат да се комбинират с помощта на побитовото "или").

сегмент за четене

PT_NOTE сегмент

В сегмента на ELF файлове с типа PT_NOTE магазин допълнителна информация за състоянието на изпълнението на програмата. Сегмент се съдържа произволен брой произволни записи размер. Сегмент винаги е с размер, което се дели на 4 байта (за Elf32) и всеки запис в сегмента започва компенсира кратно на 4 байта. В началото на всеки запис е запис глава, представено със следната структура:

n_namesz състои дължина име запис област. Името трябва да е не-празен низ, който изтича байт 0. много име низ започва да записва веднага след Elf32_Nhdr структура.

n_descsz поле съдържа информация по отношение на дължината на записа. Дължината трябва да е кратно на 4 байта. Частта от данни на записа започва веднага след името на записа, на базата на изравняване е 4 байта.

n_type поле съдържа типа на запис. Възможни видове входни зависят от типа на файла (обект, ядро) и са разгледани в следващите раздели.

По-долу е пример сегмент PT_NOTE.

намушква грешки формат

Когато компилирате изпълним файл може да се добавя към информацията за отстраняване на грешки, че за отстраняване на грешки използва за показване на изпълнението на напредъка на програмата по отношение на езика на високо ниво. Има няколко формати на информацията за отстраняване на грешки (бодежи, ДЖУДЖЕ), тук се описва като най-лесният намушква формат.

За да се състави програма с добавянето на информацията за грешки във формата, използвана опция намушква ССЗ -gstabs. например

В намушква информация формат отстраняване на грешки се съхранява в разделите .stab и .stabstr ELF-файл.

.stab секция съдържа множество структури:

.stabstr раздел магазини струни характер, завършващи байт 0 се използват в записите в .stab секция.

Невярно n_type съхранява типа на запис. Възможни видове документи могат да бъдат намерени в stab.h. ние се интересуваме от само някои от тях.

Името на файла се задава с помощта на директиви #line или името на файла, за да бъдат включени при използване #include
n_strx - раздел Index .stabstr името на файла низ
Ние приемаме, че действието на името на файла, за да се инсталира в запис N_SOL започва с следващия запис.

Брой на изпълними реда код
n_value - изместването на първия ред на инструкции по отношение на функцията
n_desc - линия номер в изходния код

N_SLINE е организирана в промени в тази функция.

Първият запис в таблицата е .stab производителност и има N_UNDF тип. Индексът на записа се приема за 0.

името на файла, което е функция, тя може да бъде в записа на N_SOL след записа N_FUN самата функция, но за осъществяването на първия запис N_SLINE. Тя трябва да се приеме, че името на файла, в който функцията е дефинирана същото като името на файла, създаден първият запис N_SLINE в тази функция.

Пример: file1.h файл: I