gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:48:35 34 4
gpt4 key购买 nike

我写了一个简单的 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/

    34 4 0