Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект 17 страниц.doc
Скачиваний:
14
Добавлен:
15.06.2014
Размер:
826.37 Кб
Скачать

Лекция-11:

ELF

Существует три типа исполняемых ELF файлов:

  1. Перемещаемый файл, хранящий инструкции и данные, которые могут быть связаны с другими объектными файлами. Результатом такого связывания может быть исполняемый файл или разделяемый объектный файл.

  2. Разделяемый объектный файл. Также содержит инструкции и данные, но используется двумя способами. В первом случае он может быть связан с другими перемещаемыми файлами, в результате чего создается новый объектный файл. Во втором случае при запуске программы на выполнение операционная система может связать его динамически с исполняемым файлом программы. В результате чего создается исполняемый образ программы. Вообще речь идет о разделяемых библиотеках.

  3. Исполняемые файлы. Хранит полное описание, то есть инструкции, данные, описание необходимых разделяемых объектных файлов, необходимую символьную и отладочную информацию, которая помогает операционной системе создать образ процесса.

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

Информация, содержащаяся в таблице заголовком программы, указывает ядру операционной системы, как создать образ процесса из сегментов. Большинство сегментов копируются в память и представляют собой соответствующие сегменты процесса при его выполнении (например, сегмент кода или сегмент данных). Каждый заголовок сегмента программы описывает один сегмент и содержит следующую информацию:

  1. Тип сегмента и действие операционной системы с этим сегментом

  2. Расположение сегмента в файле

  3. Стартовый адрес сегмента в виртуальной памяти процесса

  4. Размер сегментов в файле

  5. Размер сегментов в памяти

  6. Флаги доступа к сегменту

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

В сегменте типа INTERР хранится программный интерпретатор. Данный тип сегмента используется для программ, которым необходимо динамическое связывание. Суть его состоит в том, что отдельные компоненты исполняемого файла подключаются не на этапе компиляции, а на этапе запуска программы на выполнение. Имя файла, являющегося динамическим редактором связей, хранится в данном сегменте. В начале в память загружается не исходная программа, а динамический редактор связей. Далее динамический редактор вместе с ядром UNIX создает полный образ исполняемого файла. То есть динамический редактор загружает необходимые разделяемые объектные файлы и производит требуемое размещение и связывание, а затем управление передается исходной программе.

Завершает файл таблица заголовков разделов или секций. Разделы определяют разделы файла, используемые для связи с другими модулями в процессе компиляции или при динамическом связывании. Разделы содержат более детальную информацию о сегментах. К примеру, сегмент кода может состоять из нескольких разделов, таких, как cash-таблица для хранения индексов, используемых в программе символов, раздел инициализационного кода программы, таблица связывания, используемая динамическим редактором и раздел, содержащий инструкции программы.

Второй тип исполняемого файла – COFF.

Заголовок содержит общую информацию, позволяющую определить месторасположение остальных компонентов. Заголовок COFF содержит следующие поля:

Заголовок COFF присутствует в исполняемых файлах, промежуточных объектных файлах и в библиотечных архивах. Каждый исполняемый файл также содержит заголовок a.out, хранящий информацию, необходимую ядру операционной системы или загрузчику для запуска программы.

Все файлы формата COFF имеют два или более разделов, каждый из которых описывается своим заголовком. В заголовке хранится имя, размер раздела, его расположение в файле и виртуальный адрес после запуска программы на выполнение.

Таблица символов и строк является основой системы отладки.

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

Некоторые вопросы организации файловой

системы в операционной системе UNIX

Работа с файлами

В среде программирования UNIX существует два основных интерфейса для файлового ввода-вывода:

  1. Интерфейсный системный вызов, предлагающий системные функции низкого уровня, непосредственно взаимодействующие с ядром операционной системы

  2. Стандартная библиотека ввода-вывода

К основным системным функциям для работы с файлами относятся:

  1. open

  2. creat

  3. сlose

  4. dup

  5. dup2

  6. lseek

  7. read

  8. ready

  9. write

  10. writev

  11. pipe

  12. fcnt1

Стандартная библиотека ввода-вывода вместо использования файлов дескриптора определяет указатель на специальную структуру данных типа FILE, называемый потоком или файловым указателем. Стандартные потоки ввода-вывода обозначаются символическими именами: stdin, stdout и stderr соответственно для потоков ввода, вывода и сообщения об ошибках. Они соответствуют файловым дескрипторам 0, 1 и 2.

extern FILE *stdin;

extern FILE *stdout;

extern FILE *stderr;

Для работы с файлами используются функции:

  • fopen

  • fclose

  • fflush

  • getc

  • putc

  • gets

  • puts

  • fread

  • fwrite

  • fseek

  • fprintf

  • fscanf

  • fileno