- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我查看 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
正如 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
A local symbol is any symbol beginning with certain local label prefixes. By default, the local label prefix is `.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' option (see Include Local Symbols: -L) to retain the local symbols in the object files.
因此,如果您使用 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/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
由以下代码在内部功能 block 作用域上使用 gcc -g
生成:
#include <stdio.h>
int main() {
int i = 0;
{
int i = 1;
printf("%d\n", i);
}
return 0;
}
LVL
:TODO 我没能轻易理解它。我们需要更多地解释来源。
关于c - 编译器生成的汇编代码中的.LFB .LBB .LBE .LVL .loc是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24787769/
当我查看 GCC 生成的汇编代码时,有很多行以 .LBB 和一个数字开头。似乎它们不是操作指令。更像是标记文件的某些内容或其他内容。 .LFB, .LVL, LBB, LBE 等在编译器中是什么生成汇
我是一名优秀的程序员,十分优秀!