libdw, readelf: Handle .debug_*.dwo section name variants.
authorMark Wielaard <mark@klomp.org>
Sat, 12 May 2018 22:05:10 +0000 (00:05 +0200)
committerMark Wielaard <mark@klomp.org>
Sat, 19 May 2018 10:37:24 +0000 (12:37 +0200)
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
libdw/dwarf_begin_elf.c
src/ChangeLog
src/readelf.c

index e66a1ec..42777b5 100644 (file)
@@ -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.
index 8bdcea2..61de752 100644 (file)
@@ -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. */
index 8a664da..bf07a79 100644 (file)
@@ -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  Dmitry V. Levin  <ldv@altlinux.org>
 
        * elflint.c (check_elf_header): Fix typo in error diagnostics.
index 854d31c..f34dd36 100644 (file)
@@ -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;
+               }
+           }
        }
     }