public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
From: Mark Wielaard <mark@klomp.org>
To: elfutils-devel@sourceware.org
Cc: Mark Wielaard <mark@klomp.org>
Subject: [PATCH] libdw, readelf: Handle .debug_*.dwo section name variants.
Date: Tue, 15 May 2018 10:33:00 -0000	[thread overview]
Message-ID: <1526380413-26703-1-git-send-email-mark@klomp.org> (raw)

The .debug_*.dwo section names are handled just like their none .dwo
variants.  The section contents is the same as sections without the .dwo
name, but they are only found in split-dwarf files.  This patch allows
opening and inspecting split-dwarf files.  It doesn't yet connect the
split-dwarf with their skeleton (or the other way around).  It also
doesn't yet handle any special split-dwarf attributes or tags.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 libdw/ChangeLog         |  5 +++++
 libdw/dwarf_begin_elf.c | 31 +++++++++++++++++++++----------
 src/ChangeLog           |  4 ++++
 src/readelf.c           | 32 +++++++++++++++++++++-----------
 4 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index e66a1ec..42777b5 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-12  Mark Wielaard  <mark@klomp.org>
+
+	* dwarf_begin_elf.c (check_section): Also recognize .dwo section
+	name variants.
+
 2018-05-11  Mark Wielaard  <mark@klomp.org>
 
 	* dwarf_formudata.c (dwarf_formudata): Handle DW_AT_macros as macptr.
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
index 8bdcea2..61de752 100644
--- a/libdw/dwarf_begin_elf.c
+++ b/libdw/dwarf_begin_elf.c
@@ -1,7 +1,6 @@
 /* Create descriptor from ELF descriptor for processing file.
-   Copyright (C) 2002-2011, 2014, 2015, 2018 Red Hat, Inc.
+   Copyright (C) 2002-2011, 2014, 2015, 2017, 2018 Red Hat, Inc.
    This file is part of elfutils.
-   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
    This file is free software; you can redistribute it and/or modify
    it under the terms of either
@@ -116,14 +115,26 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
   size_t cnt;
   bool gnu_compressed = false;
   for (cnt = 0; cnt < ndwarf_scnnames; ++cnt)
-    if (strcmp (scnname, dwarf_scnnames[cnt]) == 0)
-      break;
-    else if (scnname[0] == '.' && scnname[1] == 'z'
-	     && strcmp (&scnname[2], &dwarf_scnnames[cnt][1]) == 0)
-      {
-        gnu_compressed = true;
-        break;
-      }
+    {
+      size_t dbglen = strlen (dwarf_scnnames[cnt]);
+      size_t scnlen = strlen (scnname);
+      if (strncmp (scnname, dwarf_scnnames[cnt], dbglen) == 0
+	  && (dbglen == scnlen
+	      || (scnlen == dbglen + 4
+		  && strstr (scnname, ".dwo") == scnname + dbglen)))
+	break;
+      else if (scnname[0] == '.' && scnname[1] == 'z'
+	       && (strncmp (&scnname[2], &dwarf_scnnames[cnt][1],
+			    dbglen - 1) == 0
+		   && (scnlen == dbglen + 1
+		       || (scnlen == dbglen + 5
+			   && strstr (scnname,
+				      ".dwo") == scnname + dbglen + 1))))
+	{
+	  gnu_compressed = true;
+	  break;
+	}
+    }
 
   if (cnt >= ndwarf_scnnames)
     /* Not a debug section; ignore it. */
diff --git a/src/ChangeLog b/src/ChangeLog
index 419fa20..9b5ef79 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2018-05-12  Mark Wielaard  <mark@klomp.org>
+
+	* readelf.c (print_debug): Also recognize .dwo section name variants.
+
 2018-05-15  Mark Wielaard  <mark@klomp.org>
 
 	* readelf.c (print_form_data): Cast comparisons against offset_len to
diff --git a/src/readelf.c b/src/readelf.c
index 854d31c..f34dd36 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -9127,17 +9127,27 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
 
 	  int n;
 	  for (n = 0; n < ndebug_sections; ++n)
-	    if (strcmp (name, debug_sections[n].name) == 0
-		|| (name[0] == '.' && name[1] == 'z'
-		    && debug_sections[n].name[1] == 'd'
-		    && strcmp (&name[2], &debug_sections[n].name[1]) == 0)
-		)
-	      {
-		if ((print_debug_sections | implicit_debug_sections)
-		    & debug_sections[n].bitmask)
-		  debug_sections[n].fp (dwflmod, ebl, ehdr, scn, shdr, dbg);
-		break;
-	      }
+	    {
+	      size_t dbglen = strlen (debug_sections[n].name);
+	      size_t scnlen = strlen (name);
+	      if ((strncmp (name, debug_sections[n].name, dbglen) == 0
+		   && (dbglen == scnlen
+		       || (scnlen == dbglen + 4
+			   && strstr (name, ".dwo") == name + dbglen)))
+		  || (name[0] == '.' && name[1] == 'z'
+		      && debug_sections[n].name[1] == 'd'
+		      && strncmp (&name[2], &debug_sections[n].name[1],
+				  dbglen - 1) == 0
+		      && (scnlen == dbglen + 1
+			  || (scnlen == dbglen + 5
+			      && strstr (name, ".dwo") == name + dbglen + 1))))
+		{
+		  if ((print_debug_sections | implicit_debug_sections)
+		      & debug_sections[n].bitmask)
+		    debug_sections[n].fp (dwflmod, ebl, ehdr, scn, shdr, dbg);
+		  break;
+		}
+	    }
 	}
     }
 
-- 
1.8.3.1

             reply	other threads:[~2018-05-15 10:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-15 10:33 Mark Wielaard [this message]
2018-05-19 10:39 ` Mark Wielaard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1526380413-26703-1-git-send-email-mark@klomp.org \
    --to=mark@klomp.org \
    --cc=elfutils-devel@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).