放置本地数组会更改X86-64

时间:2017-01-17 04:14:53

标签: c gcc assembly x86 x86-64

我们在int中只有一个main变量:

int main() {
    int d;
    return 0;
}

以下代码是由gcc -S test.c在Linux上为x86-64生成的。

    .file   "test.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 6.3.1 20170109"
    .section    .note.GNU-stack,"",@progbits

将数组作为局部变量

int main() {
    int d[2];
    return 0;
}

在开头生成了很多无关的代码,我无法理解。

    .file   "test.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    leaq    -4144(%rsp), %rsp
    orq $0, (%rsp)
    leaq    4128(%rsp), %rsp
    movq    %fs:40, %rax
    movq    %rax, -8(%rbp)
    xorl    %eax, %eax
    movl    $0, %eax
    movq    -8(%rbp), %rdx
    xorq    %fs:40, %rdx
    je  .L3
    call    __stack_chk_fail@PLT
.L3:
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 6.3.1 20170109"
    .section    .note.GNU-stack,"",@progbits

具体来说,这些说明是做什么的?

    leaq    -4144(%rsp), %rsp
    orq $0, (%rsp)
    leaq    4128(%rsp), %rsp
    movq    %fs:40, %rax
    movq    %rax, -8(%rbp)
    xorl    %eax, %eax
    movl    $0, %eax

0 个答案:

没有答案