Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Романов.Модуль2.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.88 Mб
Скачать
  1. Обзор компоновщиков и процесса компоновки. Создание файла образа для целевой системы. Рисунок, пояснения.

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

Файл сборки программы (Make file)

Утилита сборки (Make Utility)

Файлы заголовков (Header Files)

Разработчик создает файл программы и файл-заголовок в исходном коде на

языке C/C++.

Часть программы может быть написана на Ассемблере и помещена в соответствующий исходный файл Ассемблера.

Разработчик также создает Makefile для утилиты Make, которая помогает ему легко отслеживать изменения файлов и вызвать компилятор Ассемблера для исходных файлов, когда это необходимо.

Из этих исходных файлов, компилятор и Ассемблер создают объектные файлы, которые содержат как машинный код, так и данные программы.

Архиватор (библиотекарь) объединяет набор объектных файлов для формирования библиотеки.

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

Командный файл компоновщика указывает компоновщику, как объединить объектные файлы и где разместить двоичный код и данные в целевой встроенной системе.

  1. Основные функции компоновщика. Взаимосвязь между таблицей символов и таблицей перемещений (переадресации). Рисунок, пояснения.

Основная функция компоновщика – объединение нескольких объектных файлов в больший перемещаемый объектный файл, либо разделяемый объектный файл (файл коллективного доступа), либо окончательный исполняемый образ. В типовой программе, часть кода в одном исходном файле может ссылаться на переменные, определенные в другом исходном файле. Функция в одном исходном файле может вызвать функцию из другого исходного файла.

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

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

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

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

Процесс компоновки, выполняемый компоновщиком, включает связывание (разрешение) символов и их перемещение.

Разрешение символов – это процесс при котором компоновщик обрабатывает каждый объектный файл и определяет (для каждого объектного файла) в каких (других) объектных файлах определены внешние символы.

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

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