2013-11-20 102 views
3

作爲一個新手侏儒,我試過的代碼提交in this page(代碼here),但是當我啓動它,我得到:DWARF信息似乎是錯誤的DW_AT_high_pc用gcc 4.8.2

$> ./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 

後調試會話,這個問題似乎來自管線78:

else if (attrcode == DW_AT_high_pc) 
     dwarf_formaddr(attrs[i], &highpc, 0); 

問題是,的attrs[i]form顯示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

回答

2

我發現了這個問題。從gcc 4.8開始,默認DWARF版本爲4.爲了使我的程序正常工作,我必須編輯tracedprog-gdwarf-2標誌。

0

作爲參考,在DWARF 4中,DW_AT_high_pc可以是類常量。在這種情況下,該值是與low_pc的偏移量。引用的代碼不處理這個問題。

2

要在gcc> = 4.8編譯的二進制文件上使用帶有libdwarf的DW_AT_high_pc而不覆蓋默認的DWARF版本,必須在提取值之前檢查屬性的形式。

根據DWARF信息的版本,DW_AT_high_pc屬性可以是DW_FORM_addr表單或DW_FORM_data8表單。每個表單都有自己的提取功能。

下面是如何檢查屬性的形式的示例:

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; 
    } 
}