× К оглавлению На главную Об авторе

   Дата и время публикации:
Дата и время модификации:

выделяет неинициализируемую память для общего использования в сегментах bss или data.


СИНТАКСИС
   .comm symbol, length [, align]
АРГУМЕНТЫ

symbol — символьный идентификатор;

length — размер.

ОПИСАНИЕ

Директива .comm декларирует символ общего использования в первом аргументе, обзываемый symbol. Во-время фазы линковки, являющимся финальным этапом сборки бинарного исполняемого модуля (бинарный образ процесса), данный символ в одном объектном файле может быть связан с объявленным или общим символом в другом таком же файле. Если LD(1) не увидит множественное определение, а только один и не более общих символов, тогда будет выделена память запрашиваемого размера во втором аргументе, именуемым length. Размер должен быть абсолютным выражением. Если LD(1) найдет несколько таких символов с одним и тем же именем, не имеющие один и тот же размер, тогда им будет выделен участок память по максимальному указанному размеру в найденных символах.

Когда используется формат ELF, директива .comm берет дополнительный третий аргумент align, являющимся желаемым выравниванием данных, на который ссылается символ. В нем указывается показатель степени по основанию 2, максимальное число будет равно 16, 256, 4096 и т.д. байт. Поэтому, например, для выравнивания к:

В отличии от хотичного (побайтового) выравнивания в 32-х разрядной архитектуре считается, что в архитектуре x86-64 границы данных естественно выравниваются, что выражается в правиле выравнивания, предложенного Intel и называемого "естественными границами" (англ. "natural boundaries")

Согласно правилу "естественными границ" производится округление размера типов данных к следующим возможным его градациям 2,4.8 или 16. Так, 10-ти байтовый тип float должен быть выравнен к 16-ти байтовому адресу, поскольку целое должно быть выравенно к 8-ми байтовому адресу, т.к. размер указателя занимает все 8-мь байт, которые тоже должны выравниваться к указанной байтовой границе (8-мь байт)

Рассмотрим пример "x86_64_typealign.c", вызываемый gasrunparts опции x86_64_typealign, в листинге 1

Листинг 1


...
****  static char string[UCHAR_MAX+1] = { 0 }; /* of length 256 bytes */  ;
...
38          .comm   string.1964,256,32
****  static unsigned long      type_8bytes  = 0UL;
...
41          .comm   type_8bytes.1963,8,8
****  static unsigned int       type_4bytes  = 0U;
...
43          .comm   type_4bytes.1962,4,4
****  static unsigned short     type_2bytes  = 0U;
...
45          .comm   type_2bytes.1961,2,2
****  static unsigned long      type_8bytes  = 0UL;
...
47          .comm   type_byte.1960,1,1
... 
56 DEFINED SYMBOLS
55                *ABS*:0000000000000000 x86_64_typealign.c
... 
57                .bss:0000000000000000 string.1964
58                .bss:0000000000000100 type_8bytes.1963
59                .bss:0000000000000108 type_4bytes.1962
60                .bss:000000000000010c type_2bytes.1961
61                .bss:000000000000010e type_byte.1960
62                .bss:0000000000000110 n.1959

В нем, листинге 1, в строках 38, 41, 43, 45 и 47 определены директивы .comm с указанием все трех аргументов, так для: