]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix DT_MIPS_RLD_MAP_REL tag for n64 target and 32-bit host.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 23 Jul 2015 21:52:04 +0000 (21:52 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 23 Jul 2015 21:52:04 +0000 (21:52 +0000)
For the case of MIPS n64 target and 32-bit host, the computation of
the DT_MIPS_RLD_MAP_REL tag involves sdyn->output_section->vma +
sdyn->output_offset (64-bit) being added to b (32-bit host pointer),
so losing the high part and resulting in an incorrect
DT_MIPS_RLD_MAP_REL tag, and all dynamically linked glibc tests
failing for n64.  This patch fixes this (spot-tested with glibc tests;
however, I don't have a self-contained testcase for this bug).

* elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections)
<DT_MIPS_RLD_MAP_REL>: Add target address to host address
difference, not to host pointer.

bfd/ChangeLog
bfd/elfxx-mips.c

index c7915b57b53a5b4964b7e007a48b8c43df85b9f7..9db32edea3b944dc3b687ddf6a170515b7177126 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-23  Joseph Myers  <joseph@codesourcery.com>
+
+       * elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections)
+       <DT_MIPS_RLD_MAP_REL>: Add target address to host address
+       difference, not to host pointer.
+
 2015-07-22  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (opd_entry_value): Remove assertion.  Instead,
index 9932453658bcfe23383a1219700adf49946fd558..06e815823da7622ef39c6fb06053d2429e95ec5c 100644 (file)
@@ -11515,7 +11515,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
                /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
                   pointer, relative to the address of the tag.  */
                dt_addr = (sdyn->output_section->vma + sdyn->output_offset
-                          + b - sdyn->contents);
+                          + (b - sdyn->contents));
                rld_addr = (s->output_section->vma + s->output_offset
                            + h->root.u.def.value);
                dyn.d_un.d_ptr = rld_addr - dt_addr;