gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:34:01 25 4
gpt4 key购买 nike

当我查看 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 代码来生成它们以查看它们的含义:

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

  • LBBLBE 由以下代码在内部功能 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com