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 )