使用DWARF库

时间:2017-09-12 07:13:09

标签: elf dwarf

我正在努力使这段代码有效:https://github.com/eliben/code-for-blog/blob/master/2011/dwarf_get_func_addr.c 它是从Eli Bendersky在http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information上制作的教程中提取的 不幸的是,低pc和高pc返回几乎每个函数的地址总是相同的:

DW_TAG_subprogram: 'aFunctionName'

low pc  : 0x00000001
high pc : 0x7f3a00000001

而如果objdump --dwarf = codedline ./lulesh_normal>> dump_dwarf.txt 给了我:

File name                            Line number    Starting address
lulesh.cc                                   1297            0x402e00

lulesh.cc                                   1297            0x402e11
lulesh.cc                                   1299            0x402ee4
lulesh.cc                                   1300            0x402ef0
lulesh.cc                                   1301            0x402ef6
lulesh.cc                                   1299            0x402f00
[...]

因此它设法链接线路和地址,但没有找到功能的真实地址。 知道为什么吗?

感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

dwarf_get_func_addr.c中的代码至少有一个错误:它假定每个函数都有DW_AT_low_pcDW_AT_high_pc属性,并且如果不是这样,则会打印未初始化的值。

您应该在第42行初始化lowpc = highpc = -1;,以便不打印未初始化的值。

除此之外,如果不访问lulesh_normal二进制文件,则无法帮助您。

你应该readelf -wi lulesh_normal,然后在调试器中逐步执行list_func_in_die,并将程序读取的内容与readelf的输出进行比较 - 它们应该一对一匹配。如果他们不这样做,那么您的libdwarf版本可能会出错。