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 )