gpt4 book ai didi

c - DWARF 信息对于 DW_AT_high_pc 与 gcc 4.8.2 似乎是错误的

转载 作者:行者123 更新时间:2023-12-01 09:14:53 33 4
gpt4 key购买 nike

作为 DWARF 的新手,我尝试了提供的代码 in this page (代码是 here )但是当我启动它时,我得到:

$> ./dwarf_get_func_addr tracedprog
DW_TAG_subprogram: 'do_stuff'
abort() in libdwarf. No error argument, no handler.
zsh: abort (core dumped) ./dwarf_get_func_addr tracedprog

调试 session 后,问题似乎来自第 78 行:
    else if (attrcode == DW_AT_high_pc)
dwarf_formaddr(attrs[i], &highpc, 0);

问题是, formattrs[i]显示 attrs[i]不是地址(它被设置为 7 而不是 1)。
探索 tracedprogobjdump它给出,对于 do_stuff功能:
<1><73>: Numéro d'abréviation: 4 (DW_TAG_subprogram)
<74> DW_AT_external : 1
<74> DW_AT_name : (chaîne indirecte, décalage: 0x55): do_stuff
<78> DW_AT_decl_file : 1
<79> DW_AT_decl_line : 4
<7a> DW_AT_prototyped : 1
<7a> DW_AT_low_pc : 0x400500
<82> DW_AT_high_pc : 0x3f
<8a> DW_AT_frame_base : 1 bloc d'octets: 9c (DW_OP_call_frame_cfa)
<8c> DW_AT_GNU_all_tail_call_sites: 1
<8c> DW_AT_sibling : <0xb9>

在此输出中, DW_AT_high_pc对我来说似乎不正确,因为它只有两个八位字节长。

供大家引用,我整理了 tracedprog和:
$> gcc -g tracedprog2.c -o tracedprog

编辑 好像是 gcc问题,因为在另一台机器上没有问题。我正在使用 gcc 4.8.2 .

最佳答案

使用 DW_AT_high_pc在由 gcc >= 4.8 编译的二进制文件上使用 libdwarf 而不覆盖默认的 DWARF 版本,必须在提取值之前检查属性的形式。

根据 DWARF 信息的版本,DW_AT_high_pc属性可以是 DW_FORM_addr表格或 DW_FORM_data8形式。每个表格都有自己的提取功能。

以下是如何检查 an 属性的形式的示例:

void print_attribute(Dwarf_Attribute a)
{
Dwarf_Half form;
Dwarf_Error err;
Dwarf_Half attrcode;
unsigned int offset = 0;
Dwarf_Addr addr;

dwarf_whatform(a, &form, &err);

switch(form)
{
case DW_FORM_addr:
dwarf_formaddr(a, &addr, &err);
printf("DW_FORM_addr: 0x%08llx\n", addr);
break;
case DW_FORM_data8:
dwarf_formudata(a, &offset , &err);
printf("DW_FORM_data8: 0x%08llx\n", offset);
break;
default:
break;
}
}

关于c - DWARF 信息对于 DW_AT_high_pc 与 gcc 4.8.2 似乎是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20097138/

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