gpt4 book ai didi

gcc - .cfi_remember_state 的实现

转载 作者:行者123 更新时间:2023-12-04 17:26:36 26 4
gpt4 key购买 nike

我想知道如何准确 .cfi_remember_state被执行。我知道这是一个伪操作,所以我想它在组装时会被转换成几条指令。我感兴趣的是使用什么确切的指令来实现它。我尝试了很多方法来弄清楚。即:

  • 阅读 GAS 源代码。但未能找到任何足够有用的东西。
  • 阅读 GAS 文档。但是.cfi_remember_state入门只是一个简单的笑话(字面意思)。
  • 试图找到一个 gcc 开关,使 gcc 从带有“扩展”伪操作的 C 代码生成 asm。无法为 x86/x86-64 找到这样的开关。 (如果有人能指出这样的开关就好了,假设它存在的话,顺便说一句。)
  • Google-fu && 搜索 SO 没有产生任何有用的东西。

  • 我认为唯一的其他解决方案是读取组装的可执行文件的二进制文件并尝试推断指令。然而,我想避免这样一项艰巨的任务。
    你们中的任何人,谁知道,能启发我,它是如何在 x86 和/或 x86-64 上实现的?也许与分享获取信息的方式/地点一起,以便我可以在需要时检查其他伪操作?

    最佳答案

    该指令是 DWARF 信息的一部分(实际上它所做的只是发出 DW_CFA_remember_state 指令)。摘自 DWARF3 标准:

    The DW_CFA_remember_state instruction takes no operands. The required action is to push the set of rules for every register onto an implicit stack.



    您可以使用 objdump 来处理 DWARF 信息。让我们从简单的 void 汇编程序文件开始:
      .text
    .globl main
    .type main, @function
    main:
    .LFB0:
    .cfi_startproc
    #.cfi_remember_state
    .cfi_endproc
    .LFE0:
    .size main, .-main

    gcc cfirem.s -c -o cfirem.o 编译它

    现在用 objdump --dwarf cfirem.o 反汇编生成的 DWARF 部分
    你会得到:
    00000018 00000014 0000001c FDE cie=00000000 pc=00000000..00000000
    DW_CFA_nop
    DW_CFA_nop
    ...

    如果您取消注释 .cfi_remember_state,您将看到:
    00000018 00000014 0000001c FDE cie=00000000 pc=00000000..00000000
    DW_CFA_remember_state
    DW_CFA_nop
    DW_CFA_nop
    ...

    所以它并没有真正转换成 汇编指令(尝试 objdump -d 以查看我们的示例中根本没有汇编指令)。它在 DWARF 伪指令中转换,当 GDB 等调试器处理变量位置、堆栈信息等时使用。

    关于gcc - .cfi_remember_state 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582306/

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