From: Vladimir Mezentsev Date: Thu, 10 Oct 2024 21:15:51 +0000 (-0700) Subject: Fix 32110 gprofng segfaults on parsing DWARF of clang++ 18.1.3 produced binary X-Git-Tag: gdb-16-branchpoint~673 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d9252a0459d2d62eeca3213264c67bde23c679bd;p=thirdparty%2Fbinutils-gdb.git 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 PR 32110 * src/DwarfLib.cc: Handle DW_FORM_strx* forms. --- diff --git a/gprofng/src/DwarfLib.cc b/gprofng/src/DwarfLib.cc index 18c47a4ee95..a150c76cdd5 100644 --- a/gprofng/src/DwarfLib.cc +++ b/gprofng/src/DwarfLib.cc @@ -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 : ""); 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_addrx2: 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_addrx3: 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_addrx4: 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: + atf->u.offset = debug_infoSec->Get_16 (); + break; + case DW_FORM_addrx3: + atf->u.offset = debug_infoSec->Get_24 (); + break; + case DW_FORM_addrx4: case DW_FORM_ref_sup4: atf->u.offset = debug_infoSec->Get_32 (); break;