Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译器生成的汇编代码中的.LFB.LBB.LBE.LVL.loc是什么_C_Gcc_Assembly - Fatal编程技术网

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

编译器生成的汇编代码中的.LFB.LBB.LBE.LVL.loc是什么,c,gcc,assembly,C,Gcc,Assembly,当我查看由GCC生成的汇编代码时,有许多行以.LBB和一个数字开头。似乎它们不是操作说明。更像是在文件上做标记什么的 编译器生成的汇编代码中有哪些.LFB、.LVL、LBB、LBE等? .loc是否表示“代码行”。这些行是否仅表示符号表 这是一段代码 main: .LFB1: .loc 1 8 0 .cfi_startproc .LVL2: .LBB4: .LBB5: .loc 1 2 0 movsd b(%rip), %xmm0 .LBE5: .LBE4: .loc 1 1

当我查看由GCC生成的汇编代码时,有许多行以
.LBB
和一个数字开头。似乎它们不是操作说明。更像是在文件上做标记什么的

编译器生成的汇编代码中有哪些
.LFB
、.LVL、
LBB
LBE
等?
.loc是否表示“代码行”。这些行是否仅表示符号表

这是一段代码

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

.loc
指令用于指示源代码的对应行。 表示对应源代码的文件号、行号、列号

其余的看起来像标签。

.loc

正如Ferruccio所提到的那样,
.loc
是一个调试指令,只有当您告诉编译器使用
-ggdb
生成调试信息时,它才会出现在GCC 4.8.2中

.loc
记录在,具体输出取决于调试数据格式(DWARF2等)

另一种是标签

.L前缀

GCC使用
.L
作为本地标签

默认情况下,GAS不会在编译输出上生成任何符号,记录在:

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

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

因此,如果使用:
as-ca.S
编译,
nma.o
根本不显示这些标签

这仅仅是因为不能从C程序生成这样的标签

还有一些管理它的选项,如:

  • 人作为
    ——保留本地人
  • man-ld
    ——放弃所有
这似乎是一个特定于GCC工具链的约定,而不是ELF ABI或NASM的一部分

此外,NASM和GAS都使用以句点开头的标签(GAS中的
.L
除外)生成本地符号的约定:这些符号仍然存在于输出中,但不会跨对象文件使用

后缀

您提到的后缀似乎都与调试相关,因为它们都是在GCC 4.8.2中定义的,并且是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;
    }
    
    #包括
    int main(){
    int i=0;
    {
    int i=1;
    printf(“%d\n”,i);
    }
    返回0;
    }
    
  • LVL
    :托多我不容易理解它。我们需要进一步解释这个来源


这些看起来像是标签。您还可以给我们输入C代码和准确的编译命令吗?您知道每行实际代码都有大量标签的原因吗?(尽管我认为它们可能来自代码的样板片段,“清理”被认为是不必要和/或昂贵的。)值得注意的是,
.loc
显然代表
代码行。它包含的所有信息都与给定的行有关。更新了到dwarfout@Waqar的链接,谢谢。我想知道他们是否真的删除了标签(犯罪!),或者我最初是不是复制错了。