Stop the BFD library from issuing a warning message when processing allocated section...
authorNick Clifton <nickc@redhat.com>
Tue, 2 Jul 2019 14:58:29 +0000 (15:58 +0100)
committerNick Clifton <nickc@redhat.com>
Tue, 2 Jul 2019 14:58:29 +0000 (15:58 +0100)
PR 24717
* elf.c (is_debuginfo_file): New function.
(assign_file_positions_for_non_load_sections): Do not warn about
allocated sections outside of loadable segments if they are found
in a debuginfo file.
* elf-bfd.h (is_debuginfo_file): Prototype.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c

index 063af9ca100347d06b57d0e07830a97d2a76251c..1e2a3f1b79332809c2459a926cb25f9e61bbec48 100644 (file)
@@ -1,3 +1,12 @@
+2019-07-02  Nick Clifton  <nickc@redhat.com>
+
+       PR 24717
+       * elf.c (is_debuginfo_file): New function.
+       (assign_file_positions_for_non_load_sections): Do not warn about
+       allocated sections outside of loadable segments if they are found
+       in a debuginfo file.
+       * elf-bfd.h (is_debuginfo_file): Prototype.
+
 2019-07-02  Nick Clifton  <nickc@redhat.com>
 
        PR 24753
index 0d12f4533acec02d57cfe51cd3c8912dfb33fecd..a6a831b206ba029f2189269d95798f8c9f8616c5 100644 (file)
@@ -2751,6 +2751,8 @@ extern bfd_vma elf64_r_sym (bfd_vma);
 extern bfd_vma elf32_r_info (bfd_vma, bfd_vma);
 extern bfd_vma elf32_r_sym (bfd_vma);
 
+extern bfd_boolean is_debuginfo_file (bfd *);
+
 /* Large common section.  */
 extern asection _bfd_elf_large_com_section;
 
index 75efcc6f105bcf9b61bee9c2995ccb8ecf6e7dd8..265150d5114acf06459a07194c4db8e9c506f66f 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5810,6 +5810,35 @@ assign_file_positions_for_load_sections (bfd *abfd,
   return TRUE;
 }
 
+/* Determine if a bfd is a debuginfo file.  Unfortunately there
+   is no defined method for detecting such files, so we have to
+   use heuristics instead.  */
+
+bfd_boolean
+is_debuginfo_file (bfd *abfd)
+{
+  if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_elf_flavour)
+    return FALSE;
+
+  Elf_Internal_Shdr **start_headers = elf_elfsections (abfd);
+  Elf_Internal_Shdr **end_headers = start_headers + elf_numsections (abfd);
+  Elf_Internal_Shdr **headerp;
+
+  for (headerp = start_headers; headerp < end_headers; headerp ++)
+    {
+      Elf_Internal_Shdr *header = * headerp;
+
+      /* Debuginfo files do not have any allocated SHT_PROGBITS sections.
+        The only allocated sections are SHT_NOBITS or SHT_NOTES.  */
+      if ((header->sh_flags & SHF_ALLOC) == SHF_ALLOC
+         && header->sh_type != SHT_NOBITS
+         && header->sh_type != SHT_NOTE)
+       return FALSE;
+    }
+
+  return TRUE;
+}
+
 /* Assign file positions for the other sections.  */
 
 static bfd_boolean
@@ -5843,7 +5872,13 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
        BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
       else if ((hdr->sh_flags & SHF_ALLOC) != 0)
        {
-         if (hdr->sh_size != 0)
+         if (hdr->sh_size != 0
+             /* PR 24717 - debuginfo files are known to be not strictly
+                compliant with the ELF standard.  In particular they often
+                have .note.gnu.property sections that are outside of any
+                loadable segment.  This is not a problem for such files,
+                so do not warn about them.  */
+             && ! is_debuginfo_file (abfd))
            _bfd_error_handler
              /* xgettext:c-format */
              (_("%pB: warning: allocated section `%s' not in segment"),