What does .comm mean?

17,020

Solution 1

From the as manual:

..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, the .comm directive takes an optional third argument. This is the desired alignment of the symbol, specified as a byte boundary (for example, an alignment of 16 means that the least significant 4 bits of the address should be zero). 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.

Solution 2

.comm name, size, alignment

The .comm directive allocates storage in the data section. The storage is referenced by the identifier name. Size is measured in bytes and must be a positive integer. Name cannot be predefined. Alignment is optional. If alignment is specified, the address of name is aligned to a multiple of alignment.

Source: https://docs.oracle.com/cd/E26502_01/html/E28388/eoiyg.html

Share:
17,020

Related videos on Youtube

Pedro Henriques
Author by

Pedro Henriques

Updated on April 16, 2022

Comments

  • Pedro Henriques
    Pedro Henriques about 2 years

    I just translated this program,

    #include <stdio.h>
    
    int dam[1000][1000];
    
    
    int main (int argc, const char * argv[]) {
        // insert code here...
        printf("Hello, World!\n");
        return 0;
    }
    

    to assembly using gcc producing,

        .cstring
    LC0:
        .ascii "Hello, World!\0"
        .text
    .globl _main
    _main:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ebx
        subl    $20, %esp
        call    L3
    "L00000000001$pb":
    L3:
        popl    %ebx
        leal    LC0-"L00000000001$pb"(%ebx), %eax
        movl    %eax, (%esp)
        call    L_puts$stub
        movl    $0, %eax
        addl    $20, %esp
        popl    %ebx
        leave
        ret
    .comm _dam,1000000,5
        .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
    L_puts$stub:
        .indirect_symbol _puts
        hlt ; hlt ; hlt ; hlt ; hlt
        .subsections_via_symbols
    

    What does .comm mean? Does dam use heap space, stack space or data space?