WYOS - Выпуск №10
ЧАВО. ELF.
Wanderer, Среда, 30 Июнь 2004, 18:45
Напиши свою ОС! #10Предисловие<p><b>Здравствуйте, уважаемые читатели!</b></p>
<p>Снова пришла моя очередь забивать вашу голову полезной и не очень информацией. Да, cнова с вами старик Wanderer.
Сегодняшний выпуск посвящен формату исполняемых файлов и... 3OS (<i>Удалено из архива, ибо совершенно неактуально - Roman I Khimov</i>). Так, с чего начнем? Делайте ваши ставки, господа! Справа людям нетерпиться узнать про формат исполняемых файлов, слева кордон удерживает тех, кто категорически не согласен с ними.
Дабы разрядить конфликт, начну я с импровизированнго FAQ. Так что со ставками разбирайтесь сами - я человек занятой, все такое...
</p>
ЧаВо - ЧАстыеВОпросы<p><b>Q:</b> Я только что подписался, где мне взять архив рассылки?</p>
<p><b>A:</b> /Ну, собственно, он здесь и есть.
/.</p>
<p><b>Q:</b>Подскажите, пожалуйста, адрес вашего сайта.</p>
<p><b>A:</b> <a href="http://www.osrc.info/">http://www.osrc.info/</a></p>
<p><b>Q:</b> Куда обращаться с вопросами по рассылке?</p>
<p><b>A:</b> Лучше всего на форуме. Можете писать и на личные адреса... Но не факт, что сам автор выпуска знает полный ответ на вопрос или знает его вообще. Обязательно найдутся люди, которые искали когда-либо ответ на тот или иной вопрос и могут поделиться своими знаниями. Так что дерзайте! И ради Бога, не стесняйтесь задавать вопросы!</p>
ELF<p>ELF (Executable Linkable Format) был разработан корпорацией SUN для ее клона ОС Unix. Из-за своей гибкости ELF используется в множестве других ОС, как в качестве формата для исполняемых файлов, так и в качестве формата библиотек. </p>
<p>Любой ELF-файл состоит из следующих частей:</p>
<ul>
<li> Заголовок ELF-файла;</li>
<li> Таблица программных секций (в объектных модулях может отсутствовать);</li>
<li> Секции ELF-файла;</li>
<li> Таблица секций (в выполняемом модуле может отсутствовать)</li>
</ul>
<p>Заголовок ELF-файла предстовляет собой следующую структуру:</p>
Смещение
в файле
------------------------------------------------------------------------------
0 | "Магическая" строка |
------------------------------------------------------------------------------
4 | битность | endian | версия ELF | зарезервировано |
------------------------------------------------------------------------------
8 | зарезервировано |
------------------------------------------------------------------------------
0Ch | зерезервировано |
------------------------------------------------------------------------------
10h | тип файла | допустимый тип процессора |
------------------------------------------------------------------------------
14h | версия ELF |
------------------------------------------------------------------------------
18h | начало программного кода |
------------------------------------------------------------------------------
1Ch | смещение в файле, по которому находится таблица с Заголовком Программы (PH) |
------------------------------------------------------------------------------
20h | смещение в файле, по которому находится таблица секций (SH) |
------------------------------------------------------------------------------
24h | флаги |
------------------------------------------------------------------------------
28h | размер данного заголовка | размер записи в таблице PH |
------------------------------------------------------------------------------
2Ch | записи в таблице PH | размер записи в таблице SH |
------------------------------------------------------------------------------
30h | записи в таблице SH | индекс секции .shstrtab |
------------------------------------------------------------------------------
34h
Вот код, который описывает заголовок elf-файла:
typedef struct
{
unsigned char e_ident[EI_NIDENT]; /* Сигнатура и прочая информация */
Elf32_Half e_type; /* Тип объектного файла */
Elf32_Half e_machine; /* Аппаратная платформа (архитектура) */
Elf32_Word e_version; /* Номер версии */
Elf32_Addr e_entry; /* Адрес точки входа (стартовый адрес программы) */
Elf32_Off e_phoff; /* Смещение от начала файла таблицы программных заголовков */
Elf32_Off e_shoff; /* Смещение от начала файла таблицы заголовков секций */
Elf32_Word e_flags; /* Специфичные флаги процессора (не используется в архитектуре i386) */
Elf32_Half e_ehsize; /* Размер ELF-заголовка в байтах */
Elf32_Half e_phentsize; /* Размер записи в таблице программных заголовков */
Elf32_Half e_phnum; /* Количество записей в таблице программных заголовков */
Elf32_Half e_shentsize; /* Размер записи в таблице заго ловков секций */
Elf32_Half e_shnum; /* Количество записей в таблице заголовков секций */
Elf32_Half e_shstrndx; /* Расположение сегмента, содержащего таблицy стpок */
} Elf32_Ehdr;
e_ident[EI_NIDENT] в свою очередь выглядит так:
struct {
unsigned char ei_magic[4]; /* "Магическая" строка - 0x7f, 'E', 'L', 'F' */
unsigned char ei_class; /* Битность 1 - 32 бита, 2 - 64 бита */
unsigned char ei_data; /* Порядок следования байт 1 - прямой, 2 - обратный */
unsigned char ei_version; /* Версия ELF-файла. Допустимое значение - только 1 */
unsigned char ei_pad[9]; /* Поле для хранения информации об ОС. Опционально*/
}
e_type может принимать следующие значения:
Имя Значение Пояснения
ET_NONE 0 Неизвестный тип файла
ET_REL 1 Relocatable файл (не буду вас путать кривым переводом)
ET_EXEC 2 Исполняемый файл
ET_DYN 3 Присоеденяемый объектный файл
ET_CORE 4 Файл ядра
ET_LOPROC 0xff00 Зависит от процессора
ET_HIPROC 0xffff Зависит от процессора
А вот и соответствующая таблица для e_machine:
Имя Значение Пояснения
EM_NONE 0 Неизвестная машина
EM_M32 1 AT&T WE 32100
EM_SPARC 2 SPARC
EM_386 3 Intel 80386
EM_68K 4 Motorola 68000
EM_88K 5 Motorola 88000
EM_860 7 Intel 80860
EM_MIPS 8 MIPS RS3000
Ну как, разобрались немного? Теперь рассмотрим непривычные для нас типы, используемые в данном описании. Итак:
Имя Размер Выравнивание Назначение
Elf32_Addr 4 4 Беззнаковый. Адрес
Elf32_Half 2 2 Беззнаковый. Medium integer
Elf32_Off 4 4 Беззнаковый. Смещение
Elf32_Sword 4 4 Знаковый. Large integer
Elf32_Word 4 4 Беззнаковый. Large integer
unsigned char 1 1 Беззнаковый. Small integer
С этим закончили. Теперь давайте перейдем к таблице программных секций:
typedef struct Elf32_Shdr
{
Elf32_Word name; /* Имя */
Elf32_Word type; /* Тип */
Elf32_Word flags; /* Секция может содержать 1-битные флаги для описания различных
свойств секции */
Elf32_Addr addr; /* Если секция окажется в памяти, то это поле указывает по какому
адресу необходимо переместить первый ее байт. Иначе оно содержит 0 */
Elf32_Off offset; /* Смещение в файле, с которого начинается данная секция */
Elf32_Word size; /* Размер секции (в байтах) */
Elf32_Word link; /* Содержит ссылку на индекс в таблице заголовка секции.
Интерпретация зависит от типа секции */
Elf32_Word info; /* Дополнительная информация, интерпретация также зависит
от типа секции */
Elf32_Word addralign; /* Для секций, имеющих адреса с принудительным выравниванием.
Если данное поле имеет значение 1 или 0, то считается, что принудительноговыравнивания нет. */
Elf32_Word entsize; /* Для секций, хранящих таблицу с фиксированным размером записей.
По умолчанию - 0 */
} Elf32_Shdr;
Вот возможные значения поля 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_LOPROC 0x70000000
SHT_HIPROC 0x7fffffff
SHT_LOUSER 0x80000000
SHT_HIUSER 0xffffffff
To be continued...ЗаключениеИтак, к сожалению, сегодняшнее мое свободное время истекло.
В следующем выпуске мы все-таки добъем ELF, а потом перейдем на PE. PE мы будем изучать уже с commrade. Чтобы вы не скучали на выходных (ведь выпуск получился такой маленький) я присоеденяю к выпуску десерт. Что же там? Там вы найдете:
sstrip/
sstrip is a small utility that removes everything from an ELF file
that is not part of the file's memory image.
rebind/
rebind is another small utility that alters the binding of selected
exported symbols in an ELF object file.
elfls/
elfls is a utility that displays an ELF file's program and/or
section header tables, which serve as a kind of global roadmap to
the file's contents.
elftoc/
elftoc takes an ELF file and generates C code that defines a
structure with the same memory image, using the structures and
preprocessor symbols defined in <linux/elf.h>.
ebfc/
ebfc is a compiler for a tiny programming language. The compiler can
generate ELF executables, object files, and shared libraries.
tiny/
This directory contains a collection of very small ELF executables.
Удачного вам ковыряния!
это контент от Центр информации по операционным системам
( http://www.osrc.info/plugins/content/content.php?content.14 )