问题 什么是.LFB .LBB .LBE .LVL .loc在编译器生成的汇编代码中


当我查看GCC生成的汇编代码时,有许多行开头 .LBB 和一个数字。似乎他们不是操作指示。更像是标记文件的内容或什么。

是什么 .LFB,。LVLLBBLBE 等在编译器生成的汇编代码中? .loc是否意味着“代码行”。那些线只是表明 symbol table

这是一段代码,

main:
.LFB1:
  .loc 1 8 0
  .cfi_startproc
.LVL2:
.LBB4:
.LBB5:
  .loc 1 2 0
  movsd b(%rip), %xmm0
.LBE5:
.LBE4:
  .loc 1 10 0
  xorl  %eax, %eax
.LBB7:
.LBB6:
  .loc 1 2 0
  mulsd a(%rip), %xmm0
.LBE6:
.LBE7:
  .loc 1 9 0
  movsd %xmm0, a(%rip)
.LVL3:
  .loc 1 10 0
  ret
  .cfi_endproc

2467
2017-07-16 18:08


起源

那些看起来像是标签。 - Some programmer dude
你能给我们输入C代码和确切的编译命令吗? - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


的.loc

如Ferruccio所述 .loc 是一个调试指令,如果告诉编译器生成调试信息,它只出现在GCC 4.8.2中 -ggdb

.loc 记录在 https://sourceware.org/binutils/docs-2.18/as/LNS-directives.html#LNS-directives 确切的输出取决于调试数据格式(DWARF2等)。

另一个是标签。

.L前缀

海湾合作委员会使用 .L 对于本地标签。

默认情况下,GAS不会在编译输出上生成任何符号,如下所示: https://sourceware.org/binutils/docs-2.18/as/Symbol-Names.html

本地符号是以某些本地标签前缀开头的任何符号。默认情况下,ELF系统的本地标签前缀为“.L”

本地符号在汇编程序中定义和使用,但它们通常不保存在目标文件中。因此,在调试时它们是不可见的。您可以使用`-L'选项(请参阅包含本地符号:-L)来保留目标文件中的本地符号。

所以,如果您编译: as -c a.Snm a.o 根本不显示这些标签。

这只是有意义的,因为您无法从C程序生成此类标签。

还有一些选项可以管理它:

  • man as  --keep-locals
  • man ld  --discard-all

这似乎是GCC工具链的特定约定,不是ELF ABI也不是NASM。

此外,NASM和GAS都使用以句点开头的标签(但不是 .L 在GAS中)生成局部符号: http://www.nasm.us/doc/nasmdoc3.html#section-3.9 但仍然存在于输出上。

后缀

你提到的后缀似乎都是调试相关的,因为它们都是在下面定义的 GCC / dwarf2out.c 在GCC 4.8.2和 DWARF2 是ELF的主要调试信息格式:

#define FUNC_BEGIN_LABEL  "LFB"
#define FUNC_END_LABEL    "LFE"
#define BLOCK_BEGIN_LABEL "LBB"
#define BLOCK_END_LABEL   "LBE"
ASM_GENERATE_INTERNAL_LABEL (loclabel, "LVL", loclabel_num);

根据我的实验,其中一些只是用 gcc -g,其他人甚至没有 g

一旦我们有了这些定义名称,就很容易生成生成它们的C代码,看看它们的含义:

  • LFB 和 LFE 在函数的开头和结尾生成

  • LBB 和 LBE 由以下代码生成 gcc -g 关于内部功能块范围:

    #include <stdio.h>
    
    int main() {
        int i = 0;
        {
            int i = 1;
            printf("%d\n", i);
        }
        return 0;
    }
    
  • LVL:TODO我无法轻易理解它。我们需要更多地解释源代码。


9
2018-05-13 10:27





.loc 指令用于指示相应的源代码行。 它指示相应源代码的文件号,行号和列号。

其余的看起来像标签。


1
2017-07-16 18:14



你知道每行实际代码有很多标签的原因吗? (虽然我认为它们可能来自代码的样板片段,并且“清理”被认为是不必要的和/或昂贵的。) - usr2564301