gpt4 book ai didi

c - DWARF - 如何在给定的二进制文件中找到函数的序言结束/结尾开始地址?

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:36 25 4
gpt4 key购买 nike

我有一个 ARM 二进制文件,我需要准确找到其函数序言结束和尾声开始的地址。换句话说,我需要函数体的边界。例如,如果我有一个函数,其程序集类似于:

0x00000320 <+0>:    push    {r7, lr}
0x00000322 <+2>: sub sp, #16
0x00000324 <+4>: add r7, sp, #0
0x00000326 <+6>: str r0, [r7, #4]
0x00000328 <+8>: (Function body starts here)
...
0x0000034c <+44>: (Function body ends here)
0x0000034e <+46>: mov sp, r7
0x00000350 <+48>: pop {r7, pc}

我需要一种方法来快速找到 0x000003260x0000034e(序言结束/结尾开始)或 0x000003280x0000034c(函数体开始/结束)使用类似 readelf 或 objdump 的东西。简单地反汇编它并检查代码是行不通的(理想情况下我会使用脚本来解析 readelf 的输出或我用来获取 DWARF 信息的任何程序)。

根据 DWARF 4 标准,.debug_line 部分应该包含行号信息,其中包括“prologue_end”和“epilogue_begin”,这正是我所需要的。但是,arm-linux-readelf --debug-dump=rawline,decodedline 的输出没有给我该信息。

我正在使用带有 -ggdb3 标志的 gcc 4.8.2 进行编译。

编辑:更多信息:objdump 和 readelf 都向我展示了这样的内容:

Line Number Statements:
[0x00000074] Extended opcode 2: set Address to 0x100
[0x0000007b] Advance Line by 302 to 303
[0x0000007e] Copy
[0x0000007f] Special opcode 34: advance Address by 4 to 0x104 and Line by 1 to 304
[0x00000080] Special opcode 34: advance Address by 4 to 0x108 and Line by 1 to 305
[0x00000081] Special opcode 37: advance Address by 4 to 0x10c and Line by 4 to 309
[0x00000082] Special opcode 34: advance Address by 4 to 0x110 and Line by 1 to 310
[0x00000083] Special opcode 20: advance Address by 2 to 0x112 and Line by 1 to 311
[0x00000084] Special opcode 37: advance Address by 4 to 0x116 and Line by 4 to 315
[0x00000085] Special opcode 34: advance Address by 4 to 0x11a and Line by 1 to 316
[0x00000086] Advance Line by -13 to 303
[0x00000088] Special opcode 19: advance Address by 2 to 0x11c and Line by 0 to 303
[0x00000089] Special opcode 34: advance Address by 4 to 0x120 and Line by 1 to 304
[0x0000008a] Advance PC by 4 to 0x124
[0x0000008c] Extended opcode 1: End of Sequence

查看 binutils 的 dwarf.c 的源代码,它似乎应该在行信息转储中打印类似“Set prologue_end to true”和“Set epilogue_begin to true”的内容。然而,所有的操作码似乎都是特殊的而不是标准的。

最佳答案

这是一个非常迟来的响应,但是:如果您正在使用 LLVM,那么您可以从 DWARF 行程序状态机获取此信息:LLV​​M 发出 DW_LNS_set_prologue_endDW_LNS_set_epilogue_begin 作为每一行程序入口的标志。

GCC 显然(还)不支持这些属性,因此它的周边工具(如 readelfgdb)可能也不支持。但是你应该能够用 pyelftools 解析序言和结尾。 .

关于c - DWARF - 如何在给定的二进制文件中找到函数的序言结束/结尾开始地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25916970/

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