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

   ЛДСП 10мм Москва читать далее. |   

Инициализация пустот и секций .bss


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

Пустоты, а равно и выходные секции .bss, можно заполнить произвольными двухбайтными значениями, указав опцию инициализации в предложении SECTIONS. Подчеркнем, что опция инициализации воздействует только на пустоты и секции .bss. Опция может понадобиться, например, если необходимо заполнить определенным образом таблицу неинициализированных данных без перекомпиляции программ, или если нужно заполнить "дыру" в секции .text командами переходе к подпрограмме обработки ошибок.

Потребовать инициализации можно как для выходной секции в целом, так и для отдельной ее части. Однако в связи с тем, что неинициализированная секция .bss физически не занимает места в выходном дайле, ее нельзя проинициализировать частично. Даже если заказана инициализация только части секции .bss, она будет проинициализирована целиком. Итак, если секция .bss объединяется с секциями .text или .data (разумеется, инициализируемыми), или если инициализируется часть секции .bss, то произойдет одно из двух:

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

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

SECTIONS { sec1: { f1.o . += 0x200; f2.o (.text) } = 0xDFFF sec2: { f1.o (.bss) f2.o (.bss) = 0x1234 } sec3: { f3.o (.bss) . . . } = 0xFFFF sec4: {f4.o (.bss)} }

Здесь "дыра" размером 0x200 байт в секции sec1 заполняется значениями 0xDFFF. В секции sec2 f1.o (.bss) заполняется подразумеваемым значением 0x00, а f2.o (.bss) инициализируется последовательностью 0x1234. Все секции .bss, входящие в sec3, как и пустоты, заполняются значением 0xFFFF. Секция sec4 не инициализируется, иными словами, в объектном файле не будет данных для этой секции.



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