Дата и время публикации:
Дата и время модификации:
выделяет неинициализируемую память для общего использования в сегментах bss или data.
СИНТАКСИС
.comm symbol, length [, align]АРГУМЕНТЫ
symbol — символьный идентификатор;
length — размер.
ОПИСАНИЕДиректива .comm декларирует символ общего использования в первом аргументе, обзываемый symbol. Во-время фазы линковки, являющимся финальным этапом сборки бинарного исполняемого модуля (бинарный образ процесса), данный символ в одном объектном файле может быть связан с объявленным или общим символом в другом таком же файле. Если LD(1) не увидит множественное определение, а только один и не более общих символов, тогда будет выделена память запрашиваемого размера во втором аргументе, именуемым length. Размер должен быть абсолютным выражением. Если LD(1) найдет несколько таких символов с одним и тем же именем, не имеющие один и тот же размер, тогда им будет выделен участок память по максимальному указанному размеру в найденных символах.
Когда используется формат ELF, директива .comm берет дополнительный третий аргумент align, являющимся желаемым выравниванием данных, на который ссылается символ. В нем указывается показатель степени по основанию 2, максимальное число будет равно 16, 256, 4096 и т.д. байт. Поэтому, например, для выравнивания к:
- 16-ти байтовой границе — 4,
- 256-ти байтовой границе — 8,
- 4096-ти байтовой границе — 16,
- и .т.д. кратным двум
В отличии от хотичного (побайтового) выравнивания в 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 с указанием все трех аргументов, так для:
- символ string.1964 (символьный массив постоянной длинны C-реализации string, строка 38) с выравниванием по границе 2^32 = 4294967296 байт, но фактическим размером 256 байт о чем говорит смещение 0х100 в секции bss для следущего за ним символа type_8bytes.1963 в строке 58
- символа type_8bytes.1963 (целочисленная переменная C-реализации type_8bytes, строка 41) имеет размерность согласно своему типу 8 байта и 256 байт границу выравнивания, но как и в предыдущем случае в секции bss будет выделено 8-мь байт, равных указанному значению во втром аргументе директивы .comm;
- символа type_4bytes.1962 (целочисленная переменная C-реализации type_4bytes, строка 45), как и для символа type_2bytes.1961 (целочисленная переменная C-реализации type_2bytes, строка 44), выделяемая размерность равна 4-ре и 2-а байта соответственно, как и их байтовая граница выравнивания;
- символа type_bytes.1960 (целочисленная переменная C-реализации type_bytes, строка 47) выделяется 1 байт, но реальный выделенный размер в секции bss будет равен 2, что видно из строки 62, где смещение на следующий символ равно 2 байта.
Таким образом, в директиве .comm значение второго аргумента length является обязательным, а третьего аргумента align – желательным.
Библиография
См. п.36 общей библиографии