From 5db8103d36333afd087eb0eceaa81b5c7c98eaa3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 25 Apr 2018 12:31:42 +0200 Subject: [PATCH] libdw: Handle DW_FORM_line_strp. DW_FORM_line_strp strings come from a separate .debug_line_str section. Make error messages more distinct (no .debug_str, no .debug_line_str or not a string form). Signed-off-by: Mark Wielaard --- libdw/ChangeLog | 10 ++++++++++ libdw/dwarf_begin_elf.c | 1 + libdw/dwarf_error.c | 5 +++-- libdw/dwarf_formstring.c | 18 +++++++++++++++--- libdw/libdwP.h | 3 +++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 276f3a4..9ec493f 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,13 @@ +2018-04-24 Mark Wielaard + + * dwarf_begin_elf.c (dwarf_scnnames): Add ".debug_line_str". + * dwarf_error.c (errmsgs): Add DWARF_E_NO_DEBUG_STR and + DWARF_E_NO_DEBUG_LINE_STR. + * dwarf_formstring.c (dwarf_formstring): Handle DW_FORM_line_strp. + Get data from either .debug_str or .debug_line_str. + * libdwP.h: Add IDX_debug_line_str, DWARF_E_NO_DEBUG_STR and + DWARF_E_NO_DEBUG_LINE_STR. + 2018-04-03 Mark Wielaard * dwarf_formudata.c (__libdw_formptr): Take and return const diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c index 19a5fbb..8bdcea2 100644 --- a/libdw/dwarf_begin_elf.c +++ b/libdw/dwarf_begin_elf.c @@ -55,6 +55,7 @@ static const char dwarf_scnnames[IDX_last][19] = [IDX_debug_addr] = ".debug_addr", [IDX_debug_aranges] = ".debug_aranges", [IDX_debug_line] = ".debug_line", + [IDX_debug_line_str] = ".debug_line_str", [IDX_debug_frame] = ".debug_frame", [IDX_debug_loc] = ".debug_loc", [IDX_debug_pubnames] = ".debug_pubnames", diff --git a/libdw/dwarf_error.c b/libdw/dwarf_error.c index cbf573f..63c8bbe 100644 --- a/libdw/dwarf_error.c +++ b/libdw/dwarf_error.c @@ -1,7 +1,6 @@ /* Retrieve ELF descriptor used for DWARF access. - Copyright (C) 2002, 2003, 2004, 2005, 2009, 2014, 2015 Red Hat, Inc. + Copyright (C) 2002-2005, 2009, 2014, 2015, 2017, 2018 Red Hat, Inc. This file is part of elfutils. - Written by Ulrich Drepper , 2002. This file is free software; you can redistribute it and/or modify it under the terms of either @@ -73,6 +72,8 @@ static const char *errmsgs[] = [DWARF_E_NO_ENTRY] = N_("no entries found"), [DWARF_E_INVALID_DWARF] = N_("invalid DWARF"), [DWARF_E_NO_STRING] = N_("no string data"), + [DWARF_E_NO_DEBUG_STR] = N_(".debug_str section missing"), + [DWARF_E_NO_DEBUG_LINE_STR] = N_(".debug_line_str section missing"), [DWARF_E_NO_STR_OFFSETS] = N_(".debug_str_offsets section missing"), [DWARF_E_NO_ADDR] = N_("no address value"), [DWARF_E_NO_CONSTANT] = N_("no constant value"), diff --git a/libdw/dwarf_formstring.c b/libdw/dwarf_formstring.c index 39766ad..e7396a7 100644 --- a/libdw/dwarf_formstring.c +++ b/libdw/dwarf_formstring.c @@ -57,9 +57,14 @@ dwarf_formstring (Dwarf_Attribute *attrp) return NULL; } - if (dbg_ret->sectiondata[IDX_debug_str] == NULL) + Elf_Data *data = ((attrp->form == DW_FORM_line_strp) + ? dbg_ret->sectiondata[IDX_debug_line_str] + : dbg_ret->sectiondata[IDX_debug_str]); + if (data == NULL) { - __libdw_seterrno (DWARF_E_NO_STRING); + __libdw_seterrno ((attrp->form == DW_FORM_line_strp) + ? DWARF_E_NO_DEBUG_LINE_STR + : DWARF_E_NO_DEBUG_STR); return NULL; } @@ -72,6 +77,13 @@ dwarf_formstring (Dwarf_Attribute *attrp) IDX_debug_str, 1)) return NULL; } + else if (attrp->form == DW_FORM_line_strp) + { + if (__libdw_read_offset (dbg, dbg_ret, cu_sec_idx (cu), + attrp->valp, cu->offset_size, &off, + IDX_debug_line_str, 1)) + return NULL; + } else { Dwarf_Word idx; @@ -160,7 +172,7 @@ dwarf_formstring (Dwarf_Attribute *attrp) goto invalid_offset; } - return (const char *) dbg_ret->sectiondata[IDX_debug_str]->d_buf + off; + return (const char *) data->d_buf + off; } INTDEF(dwarf_formstring) diff --git a/libdw/libdwP.h b/libdw/libdwP.h index 594486f..4de0f6c 100644 --- a/libdw/libdwP.h +++ b/libdw/libdwP.h @@ -75,6 +75,7 @@ enum IDX_debug_aranges, IDX_debug_addr, IDX_debug_line, + IDX_debug_line_str, IDX_debug_frame, IDX_debug_loc, IDX_debug_pubnames, @@ -109,6 +110,8 @@ enum DWARF_E_NO_ENTRY, DWARF_E_INVALID_DWARF, DWARF_E_NO_STRING, + DWARF_E_NO_DEBUG_STR, + DWARF_E_NO_DEBUG_LINE_STR, DWARF_E_NO_STR_OFFSETS, DWARF_E_NO_ADDR, DWARF_E_NO_CONSTANT, -- 2.7.4