aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@ericsson.com>2017-11-24 15:41:23 -0500
committerSimon Marchi <simon.marchi@ericsson.com>2017-11-24 15:43:51 -0500
commit4e25ac038efbe5293885cc75d8a3e08b23da7cc9 (patch)
tree9d229bb7ece3584f33b3f9124703331cc0ddc534 /bfd
parent0fbc35681ff0825be97802efcccf953bc4573a45 (diff)
downloadgdb-4e25ac038efbe5293885cc75d8a3e08b23da7cc9.zip
gdb-4e25ac038efbe5293885cc75d8a3e08b23da7cc9.tar.gz
gdb-4e25ac038efbe5293885cc75d8a3e08b23da7cc9.tar.bz2
Revert "elf: Properly compute offsets of note descriptor and next note"
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog15
-rw-r--r--bfd/elf.c24
2 files changed, 10 insertions, 29 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0395dcf..55fe3b4 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/elf.c b/bfd/elf.c
index d42c949..8cd67ad 100644
--- 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;