Stop readelf from reporting gaps in the gnu build notes if the gap crosses a section...
authorNick Clifton <nickc@redhat.com>
Fri, 6 Jul 2018 12:52:59 +0000 (13:52 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 6 Jul 2018 12:52:59 +0000 (13:52 +0100)
* readelf.c (same_section): New function.
(print_gnu_build_attribute_description): Do not complain about
gaps that cross a section boundary.

binutils/ChangeLog
binutils/readelf.c

index 8b37aaeaac84e905d859e0c5a3d094bba6c2e56f..a9e0d68379ad8259b0e08d14b6f9b356ec131864 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-06  Nick Clifton  <nickc@redhat.com>
+
+       * readelf.c (same_section): New function.
+       (print_gnu_build_attribute_description): Do not complain about
+       gaps that cross a section boundary.
+
 2018-07-05  Nick Clifton  <nickc@redhat.com>
 
        * po/bg.po: Updated Bulgarian translation.
index 1b50ba763137149a9d1e83d5e0baaf93f6cf2788..88fb356cd8d6eead02ab3b24d2f5452a56f3a532 100644 (file)
@@ -17705,6 +17705,20 @@ get_symbol_for_build_attribute (Filedata *       filedata,
   return saved_sym;
 }
 
+/* Returns true iff addr1 and addr2 are in the same section.  */
+
+static bfd_boolean
+same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
+{
+  Elf_Internal_Shdr * a1;
+  Elf_Internal_Shdr * a2;
+
+  a1 = find_section_by_address (filedata, addr1);
+  a2 = find_section_by_address (filedata, addr2);
+  
+  return a1 == a2 && a1 != NULL;
+}
+
 static bfd_boolean
 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
                                       Filedata *           filedata)
@@ -17786,8 +17800,14 @@ print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
 
   if (is_open_attr)
     {
-      /* FIXME: Need to properly allow for section alignment.  16 is just the alignment used on x86_64.  */
-      if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
+      /* FIXME: Need to properly allow for section alignment.
+        16 is just the alignment used on x86_64.  */
+      if (global_end > 0
+         && start > BFD_ALIGN (global_end, 16)
+         /* Build notes are not guaranteed to be organised in order of
+            increasing address, but we should find the all of the notes
+            for one section in the same place.  */
+         && same_section (filedata, start, global_end))
        warn (_("Gap in build notes detected from %#lx to %#lx\n"),
              global_end + 1, start - 1);