From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 107050 invoked by alias); 24 Apr 2018 14:17:45 -0000 Mailing-List: contact elfutils-devel-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: elfutils-devel-owner@sourceware.org Received: (qmail 107017 invoked by uid 89); 24 Apr 2018 14:17:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.4 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=HTo:U*elfutils-devel X-Spam-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: gnu.wildebeest.org Received: from wildebeest.demon.nl (HELO gnu.wildebeest.org) (212.238.236.112) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 24 Apr 2018 14:17:41 +0000 Received: from tarox.wildebeest.org (tarox.wildebeest.org [172.31.17.39]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id A931B31F8B52; Tue, 24 Apr 2018 16:17:38 +0200 (CEST) Received: by tarox.wildebeest.org (Postfix, from userid 1000) id 6511E413CB83; Tue, 24 Apr 2018 16:17:38 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Cc: Mark Wielaard Subject: [PATCH] readelf: Use raw section data if nothing is available through libdw. Date: Tue, 24 Apr 2018 14:17:00 -0000 Message-Id: <1524579454-6638-1-git-send-email-mark@klomp.org> X-Mailer: git-send-email 1.8.3.1 X-Spam-Flag: NO X-IsSubscribed: yes X-SW-Source: 2018-q2/txt/msg00019.txt.bz2 For various debug data sections readelf has its own parsers that don't rely on libdw data structures or functions. But we still like to get the data through libdw since that will be uncompressed and/or relocated. But there can be reasons for libdw to have rejected the section data. In that case we want to try to parse the "raw" section data. Signed-off-by: Mark Wielaard --- src/ChangeLog | 13 +++++++++++++ src/readelf.c | 33 +++++++++++++++++++++------------ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 3df62a0..55c5e76 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,16 @@ +2018-04-24 Mark Wielaard + + * readelf.c (print_debug_aranges_section): Try elf_rawdata if no + sectiondata. + (print_debug_rnglists_section): Likewise. + (print_debug_ranges_section): Likewise. + (print_debug_frame_section): Likewise. + (print_debug_loclists_section): Likewise. + (print_debug_loc_section): Likewise. + (print_debug_line_section): Likewise. Check for data == NULL. + (print_debug_macinfo_section): Likewise. + (print_debug_macro_section): Likewise. + 2018-04-12 Mark Wielaard * readelf.c (dwarf_loc_list_encoding_string): New functions. diff --git a/src/readelf.c b/src/readelf.c index 0b9810f..2ae688a 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -5021,7 +5021,8 @@ print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)), return; } - Elf_Data *data = dbg->sectiondata[IDX_debug_aranges]; + Elf_Data *data = (dbg->sectiondata[IDX_debug_aranges] + ?: elf_rawdata (scn, NULL)); if (unlikely (data == NULL)) { @@ -5179,7 +5180,8 @@ print_debug_rnglists_section (Dwfl_Module *dwflmod, elf_ndxscn (scn), section_name (ebl, ehdr, shdr), (uint64_t) shdr->sh_offset); - Elf_Data *data = dbg->sectiondata[IDX_debug_rnglists]; + Elf_Data *data = (dbg->sectiondata[IDX_debug_rnglists] + ?: elf_rawdata (scn, NULL)); if (unlikely (data == NULL)) { error (0, 0, gettext ("cannot get .debug_rnglists content: %s"), @@ -5503,7 +5505,8 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg) { - Elf_Data *data = dbg->sectiondata[IDX_debug_ranges]; + Elf_Data *data = (dbg->sectiondata[IDX_debug_ranges] + ?: elf_rawdata (scn, NULL)); if (unlikely (data == NULL)) { @@ -6100,7 +6103,8 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, bool is_eh_frame = strcmp (scnname, ".eh_frame") == 0; Elf_Data *data = (is_eh_frame ? elf_rawdata (scn, NULL) - : dbg->sectiondata[IDX_debug_frame]); + : (dbg->sectiondata[IDX_debug_frame] + ?: elf_rawdata (scn, NULL))); if (unlikely (data == NULL)) { @@ -7340,8 +7344,9 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, /* There is no functionality in libdw to read the information in the way it is represented here. Hardcode the decoder. */ - Elf_Data *data = dbg->sectiondata[IDX_debug_line]; - if (unlikely (data == NULL || data->d_buf == NULL)) + Elf_Data *data = (dbg->sectiondata[IDX_debug_line] + ?: elf_rawdata (scn, NULL)); + if (unlikely (data == NULL)) { error (0, 0, gettext ("cannot get line data section data: %s"), elf_errmsg (-1)); @@ -7859,7 +7864,8 @@ print_debug_loclists_section (Dwfl_Module *dwflmod, elf_ndxscn (scn), section_name (ebl, ehdr, shdr), (uint64_t) shdr->sh_offset); - Elf_Data *data = dbg->sectiondata[IDX_debug_loclists]; + Elf_Data *data = (dbg->sectiondata[IDX_debug_loclists] + ?: elf_rawdata (scn, NULL)); if (unlikely (data == NULL)) { error (0, 0, gettext ("cannot get .debug_loclists content: %s"), @@ -8233,7 +8239,8 @@ print_debug_loc_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg) { - Elf_Data *data = dbg->sectiondata[IDX_debug_loc]; + Elf_Data *data = (dbg->sectiondata[IDX_debug_loc] + ?: elf_rawdata (scn, NULL)); if (unlikely (data == NULL)) { @@ -8428,8 +8435,9 @@ print_debug_macinfo_section (Dwfl_Module *dwflmod __attribute__ ((unused)), /* There is no function in libdw to iterate over the raw content of the section but it is easy enough to do. */ - Elf_Data *data = dbg->sectiondata[IDX_debug_macinfo]; - if (unlikely (data == NULL || data->d_buf == NULL)) + Elf_Data *data = (dbg->sectiondata[IDX_debug_macinfo] + ?: elf_rawdata (scn, NULL)); + if (unlikely (data == NULL)) { error (0, 0, gettext ("cannot get macro information section data: %s"), elf_errmsg (-1)); @@ -8590,8 +8598,9 @@ print_debug_macro_section (Dwfl_Module *dwflmod __attribute__ ((unused)), (uint64_t) shdr->sh_offset); putc_unlocked ('\n', stdout); - Elf_Data *data = dbg->sectiondata[IDX_debug_macro]; - if (unlikely (data == NULL || data->d_buf == NULL)) + Elf_Data *data = (dbg->sectiondata[IDX_debug_macro] + ?: elf_rawdata (scn, NULL)); + if (unlikely (data == NULL)) { error (0, 0, gettext ("cannot get macro information section data: %s"), elf_errmsg (-1)); -- 1.8.3.1