Revert "elf: Properly compute offsets of note descriptor and next note"
authorSimon Marchi <simon.marchi@ericsson.com>
Fri, 24 Nov 2017 20:41:23 +0000 (15:41 -0500)
committerSimon Marchi <simon.marchi@ericsson.com>
Fri, 24 Nov 2017 20:43:51 +0000 (15:43 -0500)
This reverts commit 650444eb540f9fd85e821567a3f943b4bc41b8be.

With this patch, running the GDB test case gdb.base/auxv.exp is stuck in
an infinite loop, consuming memory to the point that it renders the
machine unusable. I am reverting it so we can take our time to
investigate while not killing all the developers' machines.

bfd/ChangeLog
bfd/elf.c
binutils/ChangeLog
binutils/readelf.c
include/ChangeLog
include/elf/external.h

index 0395dcf..55fe3b4 100644 (file)
@@ -1,18 +1,3 @@
-2017-11-24  H.J. Lu  <hongjiu.lu@intel.com>
-
-       PR binutils/22444
-       * elf.c (elf_read_notes): Add an argument for note aligment.
-       (elf_parse_notes): Likewise.
-       (_bfd_elf_make_section_from_shdr): Pass section aligment to
-       elf_parse_notes.
-       (bfd_section_from_phdr): Pass segment aligment to elf_read_notes.
-       (elf_parse_notes): Add an argument for note aligment.  Use
-       ELF_NOTE_DESC_OFFSET to get the offset of the note descriptor.
-       Use ELF_NOTE_NEXT_OFFSET to get the offset of the next note
-       entry.
-       (elf_read_notes): Add an argument for note aligment and pass it
-       to elf_parse_notes.
-
 2017-11-23  Alan Modra  <amodra@gmail.com>
 
        * elf32-hppa.c (pc_dynrelocs): Define.
index d42c949..8cd67ad 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -52,10 +52,9 @@ static int elf_sort_sections (const void *, const void *);
 static bfd_boolean assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
 static bfd_boolean prep_headers (bfd *);
 static bfd_boolean swap_out_syms (bfd *, struct elf_strtab_hash **, int) ;
-static bfd_boolean elf_read_notes (bfd *, file_ptr, bfd_size_type,
-                                  size_t align) ;
+static bfd_boolean elf_read_notes (bfd *, file_ptr, bfd_size_type) ;
 static bfd_boolean elf_parse_notes (bfd *abfd, char *buf, size_t size,
-                                   file_ptr offset, size_t align);
+                                   file_ptr offset);
 
 /* Swap version information in and out.  The version information is
    currently size independent.  If that ever changes, this code will
@@ -1090,8 +1089,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
       if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
        return FALSE;
 
-      elf_parse_notes (abfd, (char *) contents, hdr->sh_size,
-                      hdr->sh_offset, hdr->sh_addralign);
+      elf_parse_notes (abfd, (char *) contents, hdr->sh_size, hdr->sh_offset);
       free (contents);
     }
 
@@ -2992,8 +2990,7 @@ bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
     case PT_NOTE:
       if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
        return FALSE;
-      if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz,
-                           hdr->p_align))
+      if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz))
        return FALSE;
       return TRUE;
 
@@ -10973,14 +10970,14 @@ elfcore_write_register_note (bfd *abfd,
 }
 
 static bfd_boolean
-elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset,
-                size_t align)
+elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
 {
   char *p;
 
   p = buf;
   while (p < buf + size)
     {
+      /* FIXME: bad alignment assumption.  */
       Elf_External_Note *xnp = (Elf_External_Note *) p;
       Elf_Internal_Note in;
 
@@ -10995,7 +10992,7 @@ elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset,
        return FALSE;
 
       in.descsz = H_GET_32 (abfd, xnp->descsz);
-      in.descdata = p + ELF_NOTE_DESC_OFFSET (in.namesz, align);
+      in.descdata = in.namedata + BFD_ALIGN (in.namesz, 4);
       in.descpos = offset + (in.descdata - buf);
       if (in.descsz != 0
          && (in.descdata >= buf + size
@@ -11057,15 +11054,14 @@ elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset,
          break;
        }
 
-      p += ELF_NOTE_NEXT_OFFSET (in.namesz, in.descsz, align);
+      p = in.descdata + BFD_ALIGN (in.descsz, 4);
     }
 
   return TRUE;
 }
 
 static bfd_boolean
-elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size,
-               size_t align)
+elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size)
 {
   char *buf;
 
@@ -11084,7 +11080,7 @@ elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size,
   buf[size] = 0;
 
   if (bfd_bread (buf, size, abfd) != size
-      || !elf_parse_notes (abfd, buf, size, offset, align))
+      || !elf_parse_notes (abfd, buf, size, offset))
     {
       free (buf);
       return FALSE;
index eab6830..32df4b9 100644 (file)
@@ -1,10 +1,3 @@
-2017-11-24  H.J. Lu  <hongjiu.lu@intel.com>
-
-       PR binutils/22444
-       * readelf.c (process_notes_at): Use ELF_NOTE_DESC_OFFSET to get
-       the offset of the note descriptor.  Use ELF_NOTE_NEXT_OFFSET to
-       get the offset of the next note entry.
-
 2017-11-23  Pavel I. Kryukov  <kryukov@frtk.ru>
 
        PR 22485
index 739367d..5944ebe 100644 (file)
@@ -17969,13 +17969,9 @@ process_notes_at (Filedata *           filedata,
          inote.namesz   = BYTE_GET (external->namesz);
          inote.namedata = external->name;
          inote.descsz   = BYTE_GET (external->descsz);
-         inote.descdata = ((char *) external
-                           + ELF_NOTE_DESC_OFFSET (inote.namesz,
-                                                   section->sh_addralign));
+         inote.descdata = inote.namedata + align_power (inote.namesz, 2);
          inote.descpos  = offset + (inote.descdata - (char *) pnotes);
-         next = ((char *) external
-                 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz,
-                                         section->sh_addralign));
+         next = inote.descdata + align_power (inote.descsz, 2);
        }
       else
        {
index a766867..670456c 100644 (file)
@@ -1,10 +1,3 @@
-2017-11-24  H.J. Lu  <hongjiu.lu@intel.com>
-
-       PR binutils/22444
-       * elf/external.h (ELF_ALIGN_UP): New.
-       (ELF_NOTE_DESC_OFFSET): Likewise.
-       (ELF_NOTE_NEXT_OFFSET): Likewise.
-
 2017-11-16  Tamar Christina  <tamar.christina@arm.com>
 
        * opcode/aarch64.h: (AARCH64_FEATURE_F16_FML): New.
index eb0a53a..d65bae0 100644 (file)
@@ -183,22 +183,6 @@ typedef struct {
   char         name[1];                /* Start of the name+desc data */
 } Elf_External_Note;
 
-/* Align an address upward to a boundary, expressed as a number of bytes.
-   E.g. align to an 8-byte boundary with argument of 8.  */
-#define ELF_ALIGN_UP(addr, boundary) \
-  (((bfd_vma) (addr) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary) -1))
-
-/* Compute the offset of the note descriptor from size of note entry's
-   owner string and note alignment.  */
-#define ELF_NOTE_DESC_OFFSET(namesz, align) \
-  ELF_ALIGN_UP (offsetof (Elf_External_Note, name) + (namesz), (align))
-
-/* Compute the offset of the next note entry from size of note entry's
-   owner string, size of the note descriptor and note alignment.  */
-#define ELF_NOTE_NEXT_OFFSET(namesz, descsz, align) \
-  ELF_ALIGN_UP (ELF_NOTE_DESC_OFFSET ((namesz), (align)) + (descsz), \
-               (align))
-
 /* Relocation Entries */
 typedef struct {
   unsigned char r_offset[4];   /* Location at which to apply the action */