gcc - gcc 程序集输出标签是什么意思?

标签 gcc assembly

我写了一个简单的 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 自动生成。为什么需要这些标签?似乎有些标签是多余的。
  • gcc 版本:4.1.2
  • 机器:x86_64
  • 最佳答案

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

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

    用两个(或更多)标签标记同一位置绝对没有缺点,因此没有尝试避免这种情况。这就是为什么有几个位置有两个连续标签而没有干预操作的原因。

    如果你真的想知道是什么,例如 LCxLFBx系列标签的意思,阅读compiler source code .这是一个不平凡的代码库,因此预计会花费数小时来寻找相关模块。

    我迎接了挑战,因此——有一些编译器编写经验——我找到了 module /trunk/gcc/dwarf2out.c 这似乎使用相同的策略生成标签名称。查看第 250 行,了解有关符号含义的简洁线索。这个模块的大部分内容决定了标签,但它有近 23,000 行长,所以它可以很好地测试你的好奇心。

    关于gcc - gcc 程序集输出标签是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9799676/

    相关文章:

    debugging - FSTP DWORD PTR DS :[ESI+1224] do? 是什么意思

    c++ - 使用 cmake 实用程序编译时出错

    gcc - 为什么 GDB 不显示行号或函数名?

    gcc - 如何隐藏#pragma消息中的额外输出

    linux - 为什么我的 shellcode 在从 C 执行时会出现段错误,而不是作为独立的可执行文件执行?

    linux - 汇编部门和 float

    c - 使用 scanf 处理多种数据类型

    为 Labview 创建 DLL

    linux - 有没有办法在linux中去除dll文件中的时间戳和日期?有可用的工具吗?

    c++ - 这是 g++ 中的优化错误吗?