> man operating_systems
WYOS - Выпуск №11
ELF - продолжение
на Среда, 30 Июнь 2004, 19:01
добавил: commrade список авторов печатать элемент контента создать pdf-файл  элемент контента
категория Статьи > Write Your Own OS
комментарии: 0
просмотров: 834

Продолжение разборок с форматом ELF.

Я, конечно, извиняюся...

За то, что так нагло влезаю в самое начало прекрасного выпуска от commrade, но все же... Это я, Роман. Который к тому же "I Khimov".

Как вы, наверное, уже заметили, выпусков не было фактически две недели. Это было связано с неразберихой среди выпускающих редакторов (кто, когда, о чем) и с неразберихой в высшем командном составе 3OS (кто, когда, зачем). Плюс ко всему, как всегда, загруженность другими делами... Но, мы о вас помним и мы вас ценим и любим, поэтому совесть не позволила нам не выпустить готовый выпуск в эту пятницу. Поэтому он пришел к вам в почтовые ящики сегодня, надеюсь это вас обрадовало.

Я постараюсь сделать на этой неделе очередной выпуск, и, все, больше не могу позволять себе занимать это место, в самом начале выпу...

Напиши свою ОС! #11

Здравствуйте, уважаемые подписчики!

C вами я, ваш commrade и сегодня мы закончим расcматривать под нашим микроскопом формат исполняемых файлов ELF.

Программные секции (продолжение)
Вот возможные значения поля type:

<table border='1' bgcolor='#FFFFB3'>
<tr><td><b>Имя</b></td><td><b></b></td><td><b></b></td></tr>
<tr><td>SHT_NULL </td><td>0 </td><td>Этой величиной маркируют неактивную секцию заголовка.</td></tr>
<tr><td>SHT_PROGBITS</td><td>1</td><td>Эта величина хранит информацию о программе, чей формат и используется для исполнения </td></tr>
<tr><td>SHT_SYMTAB</td><td>2</td><td>Секции SHT_SYMTAB и SHT_DYNSYM хранят таблицу символов. Секция SHT_SYMTAB обеспечивает символы для редактирования связей.</td></tr>
<tr><td>SHT_STRTAB</td><td>3</td><td>Cекция содержит строки таблицы символов.</td></tr>
<tr><td>SHT_RELA</td><td>3</td><td>Секция содержит данные для перемещения с явными слагаемыми, как например, тип Elf32_Rela для 32- битового класса объектных файлов.</td></tr>
<tr><td>SHT_HASH</td><td>5</td><td>Секция содержит символьную таблицу хэша. Все объекты, участвующие в динамической связи должны содержать символьную таблицу </td></tr>
<tr><td>SHT_DYNAMIC</td><td>6</td><td>Секция хранит информацию для динамической свя</td></tr>
<tr><td>SHT_NOTE</td><td>7</td><td>Секция хранит информацию, которая некоторым образом маркирует файл.</td></tr>
<tr><td>SHT_NOBITS</td><td>8</td><td>Секция этого типа не занимает никакого пространства в файле, но в противном случае имеет сходство с SHT_PROGBITS. Хотя эта секция и не содержит никаких байтов, sh_offset элемент содержит концептуальное файловое смещение.</td></tr>
<tr><td>SHT_REL</td><td>9</td><td>Секция содержит данные для перемещения без явных слагаемых, как например, тип Elf32_Rel для 32- битового класса объектных файлов.</td></tr>
<tr><td>SHT_SHLIB</td><td>10</td><td>Этого типа секции зарезервирована но имеет неопределенную семантику.</td></tr>
<tr><td>SHT_DYNSYM</td><td>11</td><td>Эта секция содержит минималный набор установок для динимической связи </td></tr>
<tr><td>SHT_LOPROC</td><td>0x70000000</td><td>Величины в этом включающем дипазоне зарезервированыдля процессор-специфической семантики.</td></tr>
<tr><td>SHT_HIPROC</td><td>0x7fffffff</td><td>Величины в этом включающем дипазоне зарезервированыдля процессор-специфической семантики.</td></tr>
<tr><td>SHT_LOUSER</td><td>0x80000000</td><td>Эта величина определяет более низкий связанный дипазона индексов зарезервированнх для прикладных программ.</td></tr>
<tr><td>SHT_HIUSER</td><td>0xffffffff</td><td>Эта величина определяет верхний связанный дипазона индексов зарезервированнх для прикладных программ.</td></tr>
</table>

Итак мы рассмотрели возможные значения параметра sh_type, теперь рассмотрим значения sh_flags:

<table border='1' bgcolor='#FFFFB3'>
<tr><td><b>Имя</b></td><td><b></b></td><td><b></b></td></tr>
<tr><td>SHF_WRITE</td><td>0x1</td><td>Секция содержит данные, которые могут быть перезаписанны процессом в течении </td></tr>
<tr><td>SHF_ALLOC</td><td>0x2</td><td>Секция занимат памятьв течении врмени выполнения процесса.</td></tr>
<tr><td>SHF_EXECINSTR</td><td>0x4</td><td>Секция содержит выполнямые машинные инструкции.</td></tr>
<tr><td>SHF_MASKPROC</td><td>0xf0000000</td><td>Все биты включенных в эту маску зарезервированыдля процессор-специфической семантики.</td></tr>
</table>

Два участника в заголовке секции, sh_link и sh_info, хранят специальную информацию, в зависимости от типа секции.

<table align='Center' border='1' bgcolor='#FFFFB3'>
<tr>
<td>sh_type</td><td>sh_link</td><td>sh_info</td>
</tr>
<tr>
<td>SHT_DINAMIC</td><td>Индекс заголовка секции стола строки использовался данными в </td><td>0</td>
</tr>
<tr>
<td>SHT_HASH</td><td>Индекс заголовка секции символьного стола на который стол мусора относится</td><td>0</td>
</tr>
<tr>
<td>SHT_REL</td><td>Индекс заголовка секции связанного символьного стола.</td><td>Индекс заголовка секции секции на который the
перемещение относится. </td>
</tr>
<tr>
<td>SHT_RELA</td><td>Индекс заголовка секции связанного символьного стола.

</td><td>Индекс заголовка секции секции на который the
перемещение относится. </td>
</tr>
<tr>
<td>SHT_SYMTAB</td><td>индекс заголовка секции связанного стола строки.</td><td>Один больше, чем символьный табличный индекс последнего локального символа (связь
STB_LOCAL)</td>
</tr>
<tr>
<td>SHT_DYNSYM</td><td>индекс заголовка секции связанного стола строки.</td><td>Один больше, чем символьный табличный индекс последнего локального символа (связь
STB_LOCAL)</td>
</tr>
<tr>
<td>Other</td><td>SHN_UNDEF</td><td>0</td>
</tr>
</tbody>
</table>

Специальные секции
На этом мы закончим рассматривать программные секции и перейдем к специальным секциям. Специальные секции хранят программную и управляющую информацию. Секции в списке ниже используются системой и иметь указанные типы и атрибуты.

<table border='1' bgcolor='#FFFFB3'>
<tr><td><b>Имя</b></td><td><b></b></td><td><b></b></td><td><b></b></td</tr>
<tr><td>.bss</td><td>SHT_NOBITS</td><td>SHF_ALLOC + SHF_WRITE</td><td>Эта секция содержит неинициализировнные данные.</td></tr>
<tr><td>.comment</td><td>SHT_PROGBITS</td><td>none</td><td>Эта секция хранит информацию о версии.</td></tr>
<tr><td>.data</td><td>SHT_PROGBITS</td><td>SHF_ALLOC + SHF_WRITE</td><td>Эта секция содержит инициализированые данные.</td></tr>
<tr><td>.data1</td><td>SHT_PROGBITS</td><td>SHF_ALLOC + SHF_WRITE</td><td>Эта секция содержит инициализированые данные.</td></tr>
<tr><td>.debug</td><td>SHT_PROGBITS</td><td>none</td><td>Эта секция хранит информацию для символической отладки.</td></tr>
<tr><td>.dynamic</td><td>SHT_DYNAMIC</td><td>see below</td><td>Эта секция хранит информацию о динамической связи. </td></tr>
<tr><td>.dynstr</td><td>SHT_STRTAB</td><td>SHF_ALLOC</td><td>Эта секция содержит строки необходимые для динамической свя</td></tr>
<tr><td>.dynsym</td><td>SHT_DYNSYM</td><td>SHF_ALLOC</td><td>Эта секция содержит динамическую связующую символьную таблицу.</td></tr>
<tr><td>.fini</td><td>SHT_PROGBITS</td><td>SHF_ALLOC + SHF_EXECINSTR</td><td>Эта секция содержит выполняемые инструкции, которые содействуют коду завершения процесса. То есть, когда программа выходит из нормального состояния, система выполняет код в этой секции.</td></tr>
<tr><td>.got</td><td>SHT_PROGBITS</td><td>see below</td><td>Эта секция содержит глобальную таблицу смещения</td></tr>
<tr><td>.hash</td><td>SHT_HASH</td><td>SHF_ALLOC</td><td>Эта секция содержит символьную таблицу хэша.</td></tr>
<tr><td>.init</td><td>SHT_PROGBITS</td><td>SHF_ALLOC + SHF_EXECINSTR</td><td>Эта секция содержит выполняемые инструкции, которые содействуют инициализации процесса.</td></tr>
<tr><td>.interp</td><td>SHT_PROGBITS</td><td>see below</td><td>Эта секция содержит имя пути программного интерпритатора.</td></tr>
<tr><td>.line</td><td>SHT_PROGBITS</td><td>none</td><td>Эта секция хранит информацию о номере строки для символической отладки, которая описывает корреспонденциимежду исходной программой и машинным кодом.</td></tr>
<tr><td>.note</td><td>SHT_NOTE</td><td>none</td><td>Эта секция хранит информацию в </td></tr>
<tr><td>.plt</td><td>SHT_PROGBITS</td><td>see below</td><td>Эта секция содержит процедуры таблицы связи.</td></tr>
<tr><td>.relname</td><td>SHT_REL</td><td>see below</td><td>Эта секция хранит информацию о перемещении загружаемых </td></tr>
<tr><td>.relaname</td><td>SHT_RELA</td><td>see below</td><td>Эта секция хранит информацию о перемещении загружаемых </td></tr>
<tr><td>.rodata</td><td>SHT_PROGBITS</td><td>SHF_ALLOC</td><td>Эта секции содержат данные только для чтения</td></tr>
<tr><td>.rodata1</td><td>SHT_PROGBITS</td><td>SHF_ALLOC</td><td>Эта секции содержат данные только для чтения</td></tr>
<tr><td>.shstrtab</td><td>SHT_STRTAB</td><td>none</td><td>Эта секция содержит имена </td></tr>
<tr><td>.strtab</td><td>SHT_STRTAB</td><td>see below</td><td>Эта секция содержит строки, наиболее общие строки, для связи с символьными табличными данными.</td></tr>
<tr><td>.symtab</td><td>SHT_SYMTAB</td><td>see below</td><td>Эта секция содержит символьную таблицу.</td></tr>
<tr><td>.text</td><td>SHT_PROGBITS</td><td>SHF_ALLOC + SHF_EXECINSTR</td><td>Эта секция содержит код или выполняемые инструкции программы.</td></tr>
</table>

Строковая таблица
Секции строковой таблицы содержат завершенные символьные последовательноти. Объектный файл использует эти строки, чтобы представлять символы и имена секций. Одна строка это как индекс секции в таблице строк. Первый байт, который - нулевой индекс, определен, чтобы содержать нулевой символ. Подобно строковым таблицам последний байт строки содержит нулевой символ, указывающий на завершение строк. Строка, чей индекс является нулем определяется как пустая, в зависимости от контекста. Табличная секция пустой строки разрешена: секция sh_size члена заголовка должна содержать нуль. Не равным нулю индексы недействительныдля пустого стола строки. Секция sh_name члена заголовков содержит индекс в строку заголовка табличной секции секции, как определено e_shstrndx членом заголовка ELF. Следующая таблица показывает строки таблицы с 25 байтами и строки связанными различными индексами.

<table border='1' bgcolor='#FFFFB3'>
<tr><td> </td><td> +0</td><td> +1</td><td> +2</td><td> +3</td><td> +4</td><td> +5</td><td> +6</td><td> +7</td><td> +8</td><td> +9</td></tr>
<tr><td> 0</td><td> \0</td><td> n</td><td> a</td><td> m</td><td> e</td><td> .</td><td> \0</td><td> V</td><td> a</td><td> r</td></tr>
<tr><td> 10</td><td> i</td><td> a</td><td> b</td><td> l</td><td> e</td><td> \0</td><td> a</td><td> b</td><td> l</td><td> e</td></tr>
<tr><td> 20</td><td> \0</td><td> \0</td><td> x</td><td> x</td><td> \0</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
</table>
<p>или по </p>
<table border='1' bgcolor='#FFFFB3'>
<tr><td> </td><td> </td></tr>
<tr><td> 0</td><td> none</td></tr>
<tr><td> 1</td><td> name.</td></tr>
<tr><td> 7</td><td> Variable</td></tr>
<tr><td> 11</td><td> able</td></tr>
<tr><td> 16</td><td> able</td></tr>
<tr><td> 24</td><td> null string</td></tr>
</table>

Как показно в примере, табличный индекс строки может ссылаться на любой байт в секции. Строка может появиться неоднократно: ссылки на подстроки могут существовать. Нессылочные строки также допускаются.
Таблица символов
Таблица символов объектного файла содержит информацию которую нужно распологать и перемещать программам. Символьный табличный индекс является припиской в этот массив. Индекс 0 нужен для указания на первую запись. Содержание первой записи следующее:
STN_UNDEF=0
Таблица символов имеет следующий формат:

typedef struct
{
        Elf32_Word     st_name; /* Этот член содержит индекс на 
объектные файлы символьный стол строки, который 
содержит символьных имен. */
        Elf32_Addr     st_value;/* Этот член дает величину связанного символа. */
        Elf32_Word     st_size; /* Много размер связанных символов. */
        unsigned char  st_info; /* Этот элемент определяет атрибуты 
типа и связи. */
        unsigned char  st_other;/* Этот элемент к настоящему времени 
содержит 0 и не имеет определенного значения. */
        Elf32_Half     st_shndx;/* Каждая символная табличная запись - 
определенно оносительно нескольких секции: этот элемент 
содержит важный заголовок табличного индекса секции. */
}Elf32_Sym;

Значения символов

<p>Символьные табличные данные для других объектных файловых типов по разному
интерпретируются для члена st_value.<br>
<ul>
<li>В перемещаемых файлах, st_value содержит ограничения выравнивания для символа чей индекс секции - SHN_COMMON.</li>
<li>В переместимых файлах, st_value содержит компенсацию секции для определенного символа.</li>
<li>В программах и общих объектных файлах, st_value содержит виртуальный адрес.</li>
</ul>
Хотя символьные табличные величины имеют аналогичные значения для других объектных файлов,
данные допускают эффективный доступ подходящими программами.</p>

Заключение
Уффффффффффффффффф!!!!!!!!!! Да это тебе не крозябли бозябли. Ну что хочется сказать в заключение. Тема "Формат исполняемых обектов ELF" очень большая и поэтому очень много осталось за кадром. На самом деле чтобы существенное написать по этому поводу нужно иметь представление о том как работает тот или иной формат данных, к сожалению этим представлением я не обладаю (так как никогда с ним дел не имел). Скорее всего в выпуск закрались ошибки или неточности посему если хотите меня поправить, смело пишите мне на мыло (Или оставляйте комментарий - Roman I Khimov) . И еще выпуск писался с одного иностранного источника поэтому некоторые определения выглядят так если бы китаец попытался спеть песенку "В лесу родилась ". И такие ошибки (корявый перевод и корявое понимание материала) следует поправлять. Смело пишите на "фронт программного обеспечения" бойцу-инженеру commrade с пометкой "Тебе ", с удовольствием выстрелю в спину и отстрелю какую-нибудь очень важную часть тела.
Список используемой литературы:
1. Portable Formats Specification, Version 1.1: Executable and Linkable Format (ELF)
2. http://www.nondot.org/~sabre/os/


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

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