Что значит .comm? - PullRequest
       47

Что значит .comm?

10 голосов
/ 01 февраля 2009

Я только что перевёл эту программу,

#include <stdio.h>

int dam[1000][1000];


int main (int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}

для сборки с использованием GCC,

    .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

Что означает .comm? Использует ли плотина пространство кучи, пространство стека или пространство данных?

Ответы [ 2 ]

13 голосов
/ 01 февраля 2009

Из руководства as:

.. comm объявляет общий символ с именем условное обозначение. При связывании общий символ в одном объектном файле могут быть объединены с определенный или общий символ того же имя в другом объектном файле. Если лд не видит определения для символ - только один или несколько общих символы - тогда он будет выделять длину байты неинициализированной памяти. длина должно быть абсолютным выражением. Если лд видит несколько общих символов с одно имя, и они не все имеют того же размера, он будет выделять пространство используя самый большой размер.

При использовании ELF директива .comm принимает необязательный третий аргумент. это желаемое выравнивание символ, указанный как граница байта (например, выравнивание 16 означает что наименее значимые 4 бита адрес должен быть нулевым). выравнивание должно быть абсолютным выражение, и это должно быть сила два. Если ld выделяет неинициализированный память для общего символа, это будет использовать выравнивание при размещении условное обозначение. Если выравнивание не указано, как установит выравнивание к Наибольшая сила двух меньше или равный размеру символа, до максимум 16.

3 голосов
/ 28 декабря 2015

. Имя, размер, выравнивание

Директива .comm выделяет хранилище в разделе данных. На хранилище ссылается имя идентификатора. Размер измеряется в байтах и ​​должен быть положительным целым числом. Имя не может быть предопределено. Выравнивание не является обязательным. Если указано выравнивание, адрес имени выравнивается по кратности выравнивания.

Источник: https://docs.oracle.com/cd/E26502_01/html/E28388/eoiyg.html

...