mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
Fix 32110 gprofng segfaults on parsing DWARF of clang++ 18.1.3 produced binary
gprofng does not handle DW_FORM_strx1* forms correctly. gprofng/ChangeLog 2024-10-10 Vladimir Mezentsev <vladimir.mezentsev@oracle.com> PR 32110 * src/DwarfLib.cc: Handle DW_FORM_strx* forms.
This commit is contained in:
parent
df89bdf0ba
commit
d9252a0459
@ -1006,6 +1006,10 @@ Dwr_Tag::dump ()
|
||||
case DW_FORM_string:
|
||||
case DW_FORM_line_strp:
|
||||
case DW_FORM_strp_sup:
|
||||
case DW_FORM_strx1:
|
||||
case DW_FORM_strx2:
|
||||
case DW_FORM_strx3:
|
||||
case DW_FORM_strx4:
|
||||
case DW_FORM_implicit_const:
|
||||
Dprintf (DUMP_DWARFLIB, " \"%s\"", atrp->u.str ? atrp->u.str : "<NULL>");
|
||||
break;
|
||||
@ -1018,6 +1022,15 @@ Dwr_Tag::dump ()
|
||||
atrp->u.str);
|
||||
break;
|
||||
case DW_FORM_addr:
|
||||
case DW_FORM_addrx:
|
||||
case DW_FORM_addrx1:
|
||||
case DW_FORM_addrx2:
|
||||
case DW_FORM_addrx3:
|
||||
case DW_FORM_addrx4:
|
||||
case DW_FORM_ref_sup4:
|
||||
case DW_FORM_ref_sup8:
|
||||
case DW_FORM_loclistx:
|
||||
case DW_FORM_rnglistx:
|
||||
case DW_FORM_data2:
|
||||
case DW_FORM_data4:
|
||||
case DW_FORM_data8:
|
||||
@ -2058,25 +2071,40 @@ DwrCU::set_die (Dwarf_Die die)
|
||||
(void) debug_infoSec->Get_64 ();
|
||||
break;
|
||||
case DW_FORM_addrx:
|
||||
case DW_FORM_strx:
|
||||
case DW_FORM_loclistx:
|
||||
case DW_FORM_rnglistx:
|
||||
atf->u.offset = debug_infoSec->GetULEB128 ();
|
||||
break;
|
||||
case DW_FORM_addrx1:
|
||||
case DW_FORM_strx:
|
||||
atf->u.offset = debug_infoSec->GetULEB128 ();
|
||||
atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
|
||||
break;
|
||||
case DW_FORM_strx1:
|
||||
atf->u.offset = debug_infoSec->Get_8 ();
|
||||
atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
|
||||
break;
|
||||
case DW_FORM_strx2:
|
||||
atf->u.offset = debug_infoSec->Get_16 ();
|
||||
atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
|
||||
break;
|
||||
case DW_FORM_strx3:
|
||||
atf->u.offset = debug_infoSec->Get_24 ();
|
||||
atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
|
||||
break;
|
||||
case DW_FORM_strx4:
|
||||
atf->u.offset = debug_infoSec->Get_32 ();
|
||||
atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
|
||||
break;
|
||||
case DW_FORM_addrx1:
|
||||
atf->u.offset = debug_infoSec->Get_8 ();
|
||||
break;
|
||||
case DW_FORM_addrx2:
|
||||
case DW_FORM_strx2:
|
||||
atf->u.offset = debug_infoSec->Get_16 ();
|
||||
break;
|
||||
case DW_FORM_addrx3:
|
||||
case DW_FORM_strx3:
|
||||
atf->u.offset = debug_infoSec->Get_24 ();
|
||||
break;
|
||||
case DW_FORM_addrx4:
|
||||
case DW_FORM_strx4:
|
||||
case DW_FORM_ref_sup4:
|
||||
atf->u.offset = debug_infoSec->Get_32 ();
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user