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

3.1 Управляющий язык редактора связей

Выражения

В выражениях могут использоваться глобальные имена, константы и операции. Как и в языке C, числовые константы считаются десятичными, если только им не предшествует 0 для восьмерич-ных и 0x для шестнадцатеричных. Все числа трактуются как длинные целые. Имена могут содер-жать прописные и строчные буквы, цифры и символ подчеркивания. Если имя появляется внутри выражения, то в качестве значения используется его адрес. Редактор связей не просматривает таблицу имен и не пытается выяснить значения переменных, размерности массивов и т.п.

Для распознавания имен, чисел и операций редактор связей использует сканер, сгенерированный с помощью утилиты lex(1).

Зарезервированные слова и слова, которые нельзя использовать в качестве имен или названий секций:

ADDR BLOCK GROUP NEXT RANGE SPARE

ALIGN COMMON INFO NOLOAD REGIONS PHY

ASSIGN COPY LENGTH ORIGIN SECTIONS TV

BIND DSECT MEMORY OVERLAY SIZEOF

Порядок убывания приоритета знаков допустимых операций:

! ~ – (унарный минус) * / % + – (бинарный минус) >> << = = != > < <= >= & | &&

Оператор присваивания

Оператор присваивания позволяет определять внешние имена и связывать их с определенными адресами. Способы задания операторов присваивания:

имя = выражение;

имя операция = выражение;

Здесь операция – это один из знаков +, –, * или /. Оператор присваивания должен оканчиваться точкой с запятой.

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

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

Функция align используется для выравнивания по границе n байт, где n – степень двойки.

Псевдофункции SIZEOF и ADDR в качестве аргумента получают имя некоторой секции, а возвращают, соответственно, ее длину и адрес. Они могут использоваться в определениях имен вне пределов определения секций.

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

– выражения с единственным вхождением перемещаемого имени имеют перемещаемые зна-чения, независимо от наличия и количества в этом выражении констант или абсолютных имен;

– разность значений двух перемещаемых имен из одной и той же секции будет абсолютной;

– другие выражения являются комбинациями вышеупомянутых.

Описание конфигурации памяти

Предложение MEMORY используется для указания:

– общего размера виртуальной памяти целевого компьютера;

– конфигурируемых и неконфигурируемых областей виртуальной памяти.

Если предложения MEMORY отсутствуют, вся память считается конфигурируемой. Подразумеваемый размер памяти зависит от целевого компьютера.

Предложение MEMORY позволяет дать любому диапазону виртуальных адресов произвольное имя длиной не более восьми символов, которое в дальнейшем можно использовать для связывания выходных секций с адресами из поименованного диапазона. Имена областей памяти могут состоять из прописных и строчных букв, цифр и специальных символов $, ., _. Эти имена используются только в процессе работы редактора связей и не включаются ни в заголовки выходного объектного файла, ни в его таблицу имен.

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

Посредством предложения MEMORY областям памяти могут назначаться атрибуты:

R – память, допускающая чтение;

W – память, допускающая запись;

X – память, в которой могут размещаться выполняемые команды;

I – инициализируемая память.

Если атрибуты не указаны в предложениях MEMORY либо этих предложений нет вообще, то по умолчанию области памяти получают атрибуты R, W, Х и I.

Cинтаксис предложения MEMORY:

MEMORY {

имя1 (атрибуты) : origin = n1, length = n2

имя2 (атрибуты) : origin = n3, length = n4

... }

После ключевого слова origin, которое можно сократить до org или o, указывается начальный адрес области памяти. После ключевого слова length (len или l) указывается размер области. Операнд слова origin должен быть допустимым виртуальным адресом. Значения начального адреса и длины указываются в виде десятичной, восьмеричной или шестнадцатеричной константы, записанной по правилам языка C. Предложения MEMORY, а также спецификации origin и length внутри них должны отделяться друг от друга пробелами, символами табуляции, переводами строк или запятыми.

Пользуясь предложением MEMORY, можно указать редактору связей, что конфигурация памяти отличается от подразумеваемой. Например, нужно не допустить связывания объектов с адресами в пределах первых 0x10000 слов:

MEMORY {

valid: org = 0x10000, len = 0xFE0000

}