> man operating_systems
WYOS - Выпуск №10
ЧАВО. ELF.
на Среда, 30 Июнь 2004, 18:45
добавил: Wanderer список авторов печатать элемент контента создать pdf-файл  элемент контента
категория Статьи > Write Your Own OS
комментарии: 0
просмотров: 887

Кратенькое (особенно теперь, когда там большая часть вопросов потеряла актуальность и была вырезана) ЧАВО и начало разборок с форматом ELF.

Напиши свою ОС! #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.

Удачного вам ковыряния!


Комментарии доступны только авторизованным пользователям, авторизуйтесь или зарегистрируйтесь на сайте здесь

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.