gcc 汇编输出标签代表什么?

2024-02-13

我写了一个简单的C程序test.c:

#include <stdio.h>
#include <stdlib.h>
int add(int a, int b);
int main()
{
    int i=5,j=10;
    int result;
    result = add(i, j);
    printf("result is %d\n", result);
}
int add(int a, int b)
{
    return (a + b);
}

我编译了它:

gcc -S -Os -o test.s test.c 

我得到了程序集文件test.s:

        .file   "test3.c"
    .section    .rodata
.LC0:
    .string "result is %d\n"
    .text
.globl main
    .type   main, @function
main:
.LFB5:
    pushq   %rbp
.LCFI0:
    movq    %rsp, %rbp
.LCFI1:
    subq    $16, %rsp
.LCFI2:
    movl    $5, -12(%rbp)
    movl    $10, -8(%rbp)
    movl    -8(%rbp), %esi
    movl    -12(%rbp), %edi
    call    add
    movl    %eax, -4(%rbp)
    movl    -4(%rbp), %esi
    movl    $.LC0, %edi
    movl    $0, %eax
    call    printf
    leave
    ret
.LFE5:
    .size   main, .-main
.globl add
    .type   add, @function
add:
.LFB6:
    pushq   %rbp
.LCFI3:
    movq    %rsp, %rbp
.LCFI4:
    movl    %edi, -4(%rbp)
    movl    %esi, -8(%rbp)
    movl    -8(%rbp), %eax
    addl    -4(%rbp), %eax
    leave
    ret
.LFE6:
    .size   add, .-add
    .section    .eh_frame,"a",@progbits
.Lframe1:
    .long   .LECIE1-.LSCIE1
.LSCIE1:
    .long   0x0
    .byte   0x1
    .string "zR"
    .uleb128 0x1
    .sleb128 -8
    .byte   0x10
    .uleb128 0x1
    .byte   0x3
    .byte   0xc
    .uleb128 0x7
    .uleb128 0x8
    .byte   0x90
    .uleb128 0x1
    .align 8
.LECIE1:
.LSFDE1:
    .long   .LEFDE1-.LASFDE1
.LASFDE1:
    .long   .LASFDE1-.Lframe1
    .long   .LFB5
    .long   .LFE5-.LFB5
    .uleb128 0x0
    .byte   0x4
    .long   .LCFI0-.LFB5
    .byte   0xe
    .uleb128 0x10
    .byte   0x86
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI1-.LCFI0
    .byte   0xd
    .uleb128 0x6
    .align 8
.LEFDE1:
.LSFDE3:
    .long   .LEFDE3-.LASFDE3
.LASFDE3:
    .long   .LASFDE3-.Lframe1
    .long   .LFB6
    .long   .LFE6-.LFB6
    .uleb128 0x0
    .byte   0x4
    .long   .LCFI3-.LFB6
    .byte   0xe
    .uleb128 0x10
    .byte   0x86
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI4-.LCFI3
    .byte   0xd
    .uleb128 0x6
    .align 8
.LEFDE3:
    .ident  "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-48)"
    .section    .note.GNU-stack,"",@progbits

我理解所有这些说明,但我真的不明白这些标签的含义。.LC0, .LFB5, .LCFI0, .LCFI1, .LCFI2, .LFE5, ...这些标签是由 gcc 自动生成的。为什么需要这些标签?看来有些标签是多余的。

  • 海湾合作委员会版本:4.1.2
  • 机器:x86_64

编译器将为需要引用地址的任何位置生成一个标签,无论是跳转或分支指令,还是数据位置。

编译器不需要创建直观的命名标签,因为它们仅由它生成的代码引用,并且没有最终用户可见性,因此它会生成或多或少按顺序命名的标签,并采用一种方案来防止意外创建相同的标签两个不同的位置。

使用两个(或更多)标签来标记同一位置绝对没有任何缺点,因此不会尝试避免这种情况。这就是为什么有一些位置具有两个连续标签且没有中间操作的原因。

如果你真的想知道什么,例如,LCx and LFBx系列标签的意思是,阅读编译器源代码 http://gcc.gnu.org/svn.html。这是一个不平凡的代码库,因此需要花费数小时来查找相关模块。


我迎接了挑战,因此——拥有一些编译器编写经验——我发现module /trunk/gcc/dwarf2out.c http://gcc.gnu.org/viewcvs/trunk/gcc/dwarf2out.c?view=markup这似乎使用相同的策略生成标签名称。查看第 250 行周围,寻找有关符号含义的简洁线索。该模块的大部分内容决定了标签,但它有近 23,000 行长,因此它可以很好地测试您的好奇心。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc 汇编输出标签代表什么? 的相关文章

随机推荐