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

3.2 Предложения определения секций

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

По умолчанию, если предложения SECTIONS отсутствуют, все одноименные входные секции объединяются в выходной секции с тем же именем. Если редактируются внешние связи двух объектных файлов, из которых первый содержит секции s1 и s2, а второй – секции s3 и s4, то выходной объектный файл будет содержать четыре секции: s1, s2, s3 и s4. Порядок этих секций зависит от порядка, в котором редактор связей будет просматривать входные файлы.

Синтаксис предложений SECTIONS:

SECTIONS {

имя_выходной_секции_1 : {

спецификации_файлов,

операторы_присваивания

}

имя_выходной_секции_2 : {

спецификации_файлов,

операторы_присваивания

}

}

3.3 Спецификации файлов

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

имя_файла (имя_секции)

имя_файла (имя_секции1 имя_секции2 ...)

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

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

имя_файла [COMMON]

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

Для спецификации всех не размещенных ранее входных секций с определенным именем используется запись вида

* (имя_секции)

Указание адреса загрузки секции

Связывание выходной секции с определенным адресом виртуальной памяти достигается посредством следующей разновидности предложения SECTIONS:

SECTIONS {

имя_выходной_секции_1 адрес : {

}

}

Адрес, с которым выполняется связывание, записывается в виде константы языка C. Редактор связей выдает соответствующее сообщение об ошибке, если выходная секция и адрес не могут быть связаны. В качестве адреса можно использовать слово BIND, за которым должно следовать выражение в скобках. В этом выражении могут встречаться псевдофункции SIZEOF, ADDR и NEXT. Аргументом SIZEOF и ADDR должна быть ранее определенная секция, а аргументом NEXT – константа. Псевдофункция NEXT возвращает минимальный адрес конфигурируемой памяти, по которому еще ничего не размещено, кратный аргументу.

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

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

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