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

       

Создание пустот в выходных секциях


Специальный символ точка, ., может появляться только в предложениях определения секций и в операторах присваивания. Его появление в левой части оператора присваивания предписывает ld(1) увеличить или переустановить счетчик размещения, что приводит к образованию пустого места в выходной секции. Отметим, что под такого рода пустоты физически отводится место в выходном файле; они инициализируются с помощью заполнителя - либо подразумеваемого (0x00), либо явно указанного (см. описание опции -f в разделе Прочие возможности редактора связей и раздел Инициализация пустот и секций .bss).

Рассмотрим следующее определение секции:

outsec: { . += 0x1000; f1.o (.text) . += 0x100; f2.o (.text) . = align (4); f3.o (.text) }

Результат выполнения этого предложения будет таков:

  • В начале секции окажется "дыра" длиной 0x1000 байт, инизиализированная с помощью подразумеваемого заполнителя. Затем будет следовать входная секция .text из файла f1.o.
  • Через 0x100 байт после окончания f1.o (.text)

    окажется входная секция .text из файла f2.o.

  • Секция .text из файла f3.o будет размещена с ближайшей границы слова вслед за секцией .text из файла f2.o (выравнивание производится относительно начала секции outsec).

Размещение и выравнивание в пределах одной выходной секции производится относительно ее начала, то есть так, как если бы секция начиналась с нулевого адреса. Поэтому, если в рассмотренном выше примере адрес выходной секции outsec окажется нечетным, то нечетным будет и адрес той части outsec, куда размещается входная секция f3.o (.text), даже если f3.o (.text) и была ранее выравнена на границу слова. Этого можно избежать, потребовав выравнивания выходной секции в целом:

outsec ALIGN (4): {

Заметим, что ассемблер as(1) всегда производит выравнивание ге- нерируемых им секций на границу слова, так что можно не указывать это требование явно. То же верно и в отношении C-компилятора.

Операторы, уменьшающие счетчик размещения, являются некорректными, поскольку повторное размещение по какому-либо адресу не допускается. Как правило, для изменения счетчика размещения используются операции += и align.



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