首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >编译器生成的程序集代码中的.LFB .LBB .LBE .LVL .loc是什么?

编译器生成的程序集代码中的.LFB .LBB .LBE .LVL .loc是什么?
EN

Stack Overflow用户
提问于 2014-07-16 18:08:40
回答 2查看 10K关注 0票数 25

当我查看GCC生成的汇编代码时,有许多以.LBB和一个数字开头的线条。在这方面,他们似乎不是行动的指示。更像是在文件上做标记什么的。

在编译器生成的程序集代码中,什么是.LFB**,.**LVL**,** LBB**,** LBE 等等? .loc的意思是“代码行”吗?这些行只是表示symbol table

这是一段代码,

代码语言:javascript
代码运行次数:0
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2015-05-13 10:27:42

.loc

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

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

另一个是标签。

.L前缀

GCC使用.L作为本地标签。

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

本地符号是以某些本地标签前缀开头的任何符号。默认情况下,本地标签前缀是.L' for ELF systems Local symbols are defined and used within the assembler, but they are normally not saved in object files. Thus, they are not visible when debugging. You may use the-L的选项(请参阅包含本地符号:-L),以在对象文件中保留本地符号。

因此,如果您使用:as -c a.S编译,nm a.o根本不会显示这些标签。

这只是有意义的,因为你不能从一个C程序生成这样的标签。

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

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

这似乎是GCC工具链的具体约定,而不是部分ELF ABI或NASM。

此外,NASM和GAS都使用以句点开始的标签(GAS中的.L除外)来生成本地符号:http://www.nasm.us/doc/nasmdoc3.html#section-3.9,这些符号仍然存在于输出中,但不能跨对象文件使用。

后缀

您提到的后缀似乎都与调试相关,因为它们都是在GCC 4.8.2的gcc/侏儒2out.c中定义的,而DWARF2是ELF的主要调试信息格式:

代码语言:javascript
代码运行次数:0
运行
复制
#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代码,以了解它们的含义:

  • 在函数的开始和结束处生成LFBLFE
  • LBBLBE是由内部函数块作用域上的gcc -g代码生成的: #包含 int main() { int i= 0;{ int i= 1;printf("%d\n",i);}返回0;}
  • LVL:TODO,我不能轻易地理解它。我们得再解释一下消息来源。
票数 28
EN

Stack Overflow用户

发布于 2014-07-16 18:14:20

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

剩下的看起来像标签。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24787769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档