Создание пустот в выходных секциях
Специальный символ точка, ., может появляться только в предложениях определения секций и в операторах присваивания. Его появление в левой части оператора присваивания предписывает 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.