|
2-й проход Загрузчика Установка на начало списка имен объектных модулей. Выборка следующего имени из списка объектных модулей. Если весь список объектных модулей обработан - переход на окончание 2-го прохода. Создание для модуля Локальной таблицы внешних символов и Таблицы перемещений - пустых. Чтение заголовка очередной записи объектного модуля, если все записи модуля прочитаны - переход к обработке перемещений в модуле. Чтение остальной части записи (размер записи содержится в ее заголовке). Разветвление в зависимости от типа записи. Для кодовой записи считывается относительный адрес записи и переводится в фактический. Тело кодовой записи считывается и размещается в памяти по фактическому адресу. Для записи связывания перебираются находящиеся в ней элементы Таблицы имен Обработка разветвляется в зависимости от типа имени. Для имен сегментов или входных точек относительный адрес переводится в фактический. Имя внешней точки ищется в Глобальной таблице внешних имен. Если имя не найдено в Глобальной таблице, выдается сообщение об ошибке. Если имя найдено в Глобальной таблице, в значение адреса из Глобальной таблицы становится значением этого имени. Элемент с откорректированным адресом заносится в Локальную таблицу имен. Для записи перемещения перебираются находящиеся в ней элементы Таблицы перемещения. Относительный адрес в элементе заменяется на фактический... ... и элемент добавляется в Таблицу перемещений. После того, как весь модуль прочитан, выполняется перебор Таблицы перемещений модуля. Для каждого элемента Таблицы перемещений имя, записанное в его поле имени ищется в Локальной таблице имен и из Локальной таблицы имен выбирается связанный с этим именем адрес. Из кода программы выбирается код, адрес и длина которого записаны в элементе Таблицы перемещений. Над выбранным кодом и адресом, выбранным из Таблицы имен выполняется операция сложения или вычитания, результат записывается на место кода. После перебора всей Таблицы перемещений, освобождаются Таблица перемещений и Локальная таблица имен модуля, и управление передается на обработку следующего модуля. После обработки всех объектных модулей 2-й проход заканчивается.
|