debuginfod: Recognize .debug_*-less symtab-laden files as debuginfo
authorFrank Ch. Eigler <fche@redhat.com>
Thu, 15 Apr 2021 08:49:59 +0000 (04:49 -0400)
committerFrank Ch. Eigler <fche@redhat.com>
Thu, 15 Apr 2021 11:21:24 +0000 (07:21 -0400)
Borrow logic from elfclassify for is_debug_only() for our own
debuginfo identification.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
debuginfod/ChangeLog
debuginfod/debuginfod.cxx

index c98a837..3bd2ff6 100644 (file)
@@ -1,3 +1,8 @@
+2021-04-15  Frank Ch. Eigler <fche@redhat.com>
+
+       * debuginfod.cxx (elf_classify): Recognize symtab-only stripped files
+       like fedora's libicudata as debuginfo files.
+
 2021-03-30  Frank Ch. Eigler <fche@redhat.com>
 
        * debuginfod.cxx (main): Set child thread names.
index 473511e..2d73a13 100644 (file)
@@ -2255,6 +2255,8 @@ elf_classify (int fd, bool &executable_p, bool &debuginfo_p, string &buildid, se
         throw elfutils_exception(rc, "getshdrstrndx");
 
       Elf_Scn *scn = NULL;
+      bool symtab_p = false;
+      bool bits_alloc_p = false;
       while (true)
         {
           scn = elf_nextscn (elf, scn);
@@ -2280,7 +2282,24 @@ elf_classify (int fd, bool &executable_p, bool &debuginfo_p, string &buildid, se
               debuginfo_p = true;
               // NB: don't break; need to parse .debug_line for sources
             }
+          else if (shdr->sh_type == SHT_SYMTAB)
+            {
+              symtab_p = true;
+            }
+          else if (shdr->sh_type != SHT_NOBITS
+                   && shdr->sh_type != SHT_NOTE
+                   && (shdr->sh_flags & SHF_ALLOC) != 0)
+            {
+              bits_alloc_p = true;
+            }
         }
+
+      // For more expansive elf/split-debuginfo classification, we
+      // want to identify as debuginfo "strip -s"-produced files
+      // without .debug_info* (like libicudata), but we don't want to
+      // identify "strip -g" executables (with .symtab left there).
+      if (symtab_p && !bits_alloc_p)
+        debuginfo_p = true;
     }
   catch (const reportable_exception& e)
     {