当我查看GCC生成的汇编代码时,有许多以.LBB
和一个数字开头的线条。在这方面,他们似乎不是行动的指示。更像是在文件上做标记什么的。
在编译器生成的程序集代码中,什么是.LFB
**,.**LVL
**,** LBB
**,** LBE
等等? .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
发布于 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的主要调试信息格式:
#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
代码生成的:
#包含 int main() { int i= 0;{ int i= 1;printf("%d\n",i);}返回0;}LVL
:TODO,我不能轻易地理解它。我们得再解释一下消息来源。发布于 2014-07-16 18:14:20
.loc
指令用于指示相应的源代码行。它指示相应源代码的文件号、行号和列号。
剩下的看起来像标签。
https://stackoverflow.com/questions/24787769
复制相似问题