Операционная система UNIX. Руководство программиста

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


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

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

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

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

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

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



Содержание раздела