GAS: Объяснение .cfi_def_cfa_offset

Я хотел бы получить объяснение значений, используемых с директивами .cfi_def_cfa_offset в сборке, созданной GCC. Я смутно знаю, что директивы .cfi участвуют в фреймах вызовов и раскручивании стека, но я хотел бы более подробное объяснение того, почему, например, значения 16 и 8 используются в сборке, выводимой GCC при компиляции следующей программы на C на моей 64-битной машине Ubuntu.

Программа C:

#include <stdio.h>

int main(int argc, char** argv)
{
        printf("%d", 0);
        return 0;
}

Я вызвал GCC для исходного файла test.c следующим образом: gcc -S -O3 test.c . Я знаю, что -O3 позволяет нестандартную оптимизацию, но я хотел ограничить размер сгенерированной сборки для краткости.

Сгенерированная сборка:

        .file   "test.c"
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "%d"
        .text
        .p2align 4,,15
.globl main
        .type   main, @function
main:
.LFB22:
        .cfi_startproc
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
        xorl    %edx, %edx
        movl    $.LC0, %esi
        movl    $1, %edi
        xorl    %eax, %eax
        call    __printf_chk
        xorl    %eax, %eax
        addq    $8, %rsp
        .cfi_def_cfa_offset 8
        ret
            .cfi_endproc
.LFE22:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
        .section        .note.GNU-stack,"",@progbits

Почему значения 16 и 8 используются для директив .cfi_def_cfa_offset в сгенерированной сборке? Кроме того, почему число 22 используется для меток начала и конца локальной функции?

50
задан SamB 28 October 2011 в 10:22
поделиться