This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix DT_MIPS_RLD_MAP_REL tag for n64 target and 32-bit host.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d5cff5df74b18e1e5ed94de8f4c9adee3ffd95c6

commit d5cff5df74b18e1e5ed94de8f4c9adee3ffd95c6
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Thu Jul 23 21:52:04 2015 +0000

    Fix DT_MIPS_RLD_MAP_REL tag for n64 target and 32-bit host.
    
    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.

Diff:
---
 bfd/ChangeLog    | 6 ++++++
 bfd/elfxx-mips.c | 2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c7915b5..9db32ed 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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,
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 9932453..06e8158 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]