.comm declares a common symbol named symbol. When linking, a
common symbol in one object file may be merged with a defined or common symbol
of the same name in another object file. If
ld does not see a
definition for the symbol–just one or more common symbols–then it will
allocate length bytes of uninitialized memory. length must be an
absolute expression. If
ld sees multiple common symbols with
the same name, and they do not all have the same size, it will allocate space
using the largest size.
When using ELF or (as a GNU extension) PE, the
.comm directive takes
an optional third argument. This is the desired alignment of the symbol,
specified for ELF as a byte boundary (for example, an alignment of 16 means
that the least significant 4 bits of the address should be zero), and for PE
as a power of two (for example, an alignment of 5 means aligned to a 32-byte
boundary). The alignment must be an absolute expression, and it must be a
power of two. If
ld allocates uninitialized memory for the
common symbol, it will use the alignment when placing the symbol. If no
alignment is specified, as will set the alignment to the
largest power of two less than or equal to the size of the symbol, up to a
maximum of 16 on ELF, or the default section alignment of 4 on PE1.
The syntax for
.comm differs slightly on the HPPA. The syntax is
symbol .comm, length; symbol is optional.
is not the same as the executable image file alignment controlled by
--section-alignment option; image file sections in PE are aligned to
multiples of 4096, which is far too large an alignment for ordinary variables.
It is rather the default alignment for (non-debug) sections within object
(*.o) files, which are less strictly aligned.