Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО юнита 2.doc
Скачиваний:
45
Добавлен:
17.11.2019
Размер:
5.82 Mб
Скачать

3 Редактор связей

Управляющий язык редактора связей предоставляет следующие возможности:

– описание конфигурации памяти целевого компьютера;

– объединение секций объектного файла в порядке, отличном от подразумеваемого;

– назначение для секций определенных адресов или диапазона адресов памяти;

– определение или переопределение глобальных имен.

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

Предложения управляющего языка редактора связей помещаются в файл, имя которого указывается в командной строке ld(1). Если файл указан в командной строке и не опознан в качестве объектного модуля или библиотеки, то предполагается, что он содержит предложения управляющего языка.

Для целей размещения программ и данных виртуальная память целевого компьютера подразделяется на конфигурируемую и неконфигурируемую. По умолчанию вся память считается конфигурируемой, то есть допускается ее использование редактором связей. В микропроцессор-ных приложениях области памяти, расположенные по разным адресам, зачастую неоднородны. Например, с нулевого адреса может располагаться память постоянного запоминающего устройства размером 3K, а с адреса 20K – постоянное запоминающее устройство на 8K. Память в диапазоне от 3K до 20K-1 целесообразно сделать неконфигурируемой, то есть запретить редактору связей ld(1) использовать ее. Ничто и никогда не может быть связано с неконфигурируемой памятью. Указание того, что некоторая область памяти неконфигурируема, делает соответствующие адреса некорректными или несуществующими с точки зрения редактора связей. Конфигурацию памяти, отличную от подразумеваемой, необходимо специфицировать явно.

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

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

Применительно к редактированию внешних связей термин “физический адрес” трактуется нестандартным образом. Физический адрес секции или имени определяется как смещение относи-тельно начала (нулевого адреса) адресного пространства. Физический адрес объекта не обязательно совпадает с тем адресом, по которому объект будет помещен во время выполнения. Так, в системах со страничной виртуальной памятью адрес есть смещение относительно нулевого адреса виртуальной памяти, которое затем преобразуется аппаратурой и/или операционной системой.

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

Объектные файлы генерирует как ассемблер, вызываемый каким-либо компилятором, так и редактор внешних связей ld(1). Редактор связей, получая на вход настраиваемые объектные файлы, создает выходной объектный файл, который может требовать, а может и не требовать дополнительной настройки. При определенных условиях объектные файлы, подаваемые на вход ld(1), могут быть и абсолютными.

Файлы, которые создаются компиляторами, могут содержать секции с именами .text и .data. Секция .text содержит выполняемые команды, а секция .data – инициализированные данные.