Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C DWARF-如何在给定的二进制文件中找到函数的序言结束/结尾开始地址?_C_Assembly_Objdump_Dwarf_Readelf - Fatal编程技术网

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

C DWARF-如何在给定的二进制文件中找到函数的序言结束/结尾开始地址?,c,assembly,objdump,dwarf,readelf,C,Assembly,Objdump,Dwarf,Readelf,我有一个ARM二进制文件,我需要找到它的函数的序言结束和结尾开始的确切地址。换句话说,我需要函数体的边界。例如,如果我有一个函数,其程序集类似于: 0x00000320 <+0>: push {r7, lr} 0x00000322 <+2>: sub sp, #16 0x00000324 <+4>: add r7, sp, #0 0x00000326 <+6>: str r0, [r7, #4] 0x00000328

我有一个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}
看看比努蒂尔斯的dwarf.c的源代码,它似乎应该在行信息转储中打印类似“setprologue\u end为true”和“setepilogue\u begin为true”的内容。然而,所有的操作码似乎都是特殊的,而不是标准的。

试试看

readelf -wi
对于您正在查看的子程序,请在低pc上查找DW_,在高pc上查找DW_

矮人规范说:

一个子例程条目可以有一对DW_AT_low_pc和DW_AT_high_pc属性,或者一个DW_AT_ranges属性,其值分别编码为该子例程生成的机器指令的连续或非连续地址范围(见第2.17节)

如果我没记错的话,DW_AT_low_pc是开场白之后的地址,DW_AT_high_pc是尾声之前的最后一个地址


不要担心操作码是“特殊”的,这仅仅意味着它们不使用参数来节省编码行号程序中的空间。

这是一个非常迟的响应,但是:如果您使用的是LLVM,然后,您可以从DWARF行程序状态机获取此信息:LLVM发出
DW\u LNS\u set\u prologue\u end
DW\u LNS\u set\u epilogue\u begin
作为每个行程序条目的标志


GCC显然(还)不支持这些属性,因此其周围的工具(如
readelf
gdb
)也可能不支持这些属性。但是您应该能够用解析序言和尾声。

不幸的是,DW_AT_low_pc似乎与子例程的第一条指令(即第一条序言指令)的地址相对应而DW_AT_high_pc似乎是最后一条尾声指令之后的指令的偏移量。对于“clang-3.6-gdwarf-4-g3”值得编译的地方,我得到了“Set prologue_end to true”侏儒信息:GCC似乎还不能生成它(还?)。
readelf -wi