This is the mail archive of the binutils@sources.redhat.com 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]

mips rel32/64 to section symbol


Since we've all agreed that the current implementation of rel32
addends is broken for section symbols, but simply fixing ld to do the
right thing would require changes in ld.so that would break existing
executables, I went ahead and implemented Maciej's clever suggestion
to just emit NULL-symbol relocations instead of relocations to section
symbols.  I've tested this by creating a shared library with a static
void* initialized to point to itself, and running a program that
compared the pointer with its address.  Success on all of o32, n32 and
n64, without any changes to glibc, and this time only with
ABI-compliant relocations.

Eric Christopher approved this in private, but I'll put this in only
after my automated tester gives it a full round of testing on all 3
ABIs on big and little endian, and after I come up with testcases for
the linker to make sure this doesn't regress.  So far, I've only
tested it by hand on the 3 ABIs, verifying the presence of appropriate
relocations by visual inspection and testing that the program would
run with the old glibc as well as with a newly-built one.  I'm posting
it here earlier so as to give y'all more time to comment on it.

Index: bfd/ChangeLog
from  Alexandre Oliva  <aoliva at redhat dot com>

	* elfxx-mips.c (mips_elf_create_dynamic_relocation): Do not create
	dynamic relocations pointing to local or section symbols, use the
	NULL symbol instead.  Document the choice to not emit an
	additional R_MIPS_64 relocation.

Index: bfd/elfxx-mips.c
===================================================================
RCS file: /cvs/uberbaum/bfd/elfxx-mips.c,v
retrieving revision 1.44
diff -u -p -r1.44 elfxx-mips.c
--- bfd/elfxx-mips.c 2 Mar 2003 21:30:14 -0000 1.44
+++ bfd/elfxx-mips.c 11 Mar 2003 02:43:30 -0000
@@ -3832,7 +3832,6 @@ mips_elf_create_dynamic_relocation (outp
   else
     {
       long indx;
-      bfd_vma section_offset;
 
       /* We must now calculate the dynamic symbol table index to use
 	 in the relocation.  */
@@ -3862,15 +3861,18 @@ mips_elf_create_dynamic_relocation (outp
 		abort ();
 	    }
 
-	  /* Figure out how far the target of the relocation is from
-	     the beginning of its section.  */
-	  section_offset = symbol - sec->output_section->vma;
-	  /* The relocation we're building is section-relative.
-	     Therefore, the original addend must be adjusted by the
-	     section offset.  */
-	  *addendp += section_offset;
-	  /* Now, the relocation is just against the section.  */
-	  symbol = sec->output_section->vma;
+	  /* Instead of generating a relocation using the section
+	     symbol, we may as well make it a fully relative
+	     relocation.  We want to avoid generating relocations to
+	     local symbols because we used to generate them
+	     incorrectly, without adding the original symbol value,
+	     which is mandated by the ABI for section symbols.  In
+	     order to give dynamic loaders and applications time to
+	     phase out the incorrect use, we refrain from emitting
+	     section-relative relocations.  It's not like they're
+	     useful, after all.  This should be a bit more efficient
+	     as well.  */
+	  indx = 0;
 	}
 
       /* If the relocation was previously an absolute relocation and
@@ -3884,6 +3886,18 @@ mips_elf_create_dynamic_relocation (outp
 	 know where the shared library will wind up at load-time.  */
       outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
 				     R_MIPS_REL32);
+      /* For strict adherence to the ABI specification, we should
+	 generate a R_MIPS_64 relocation record by itself before the
+	 _REL32/_64 record as well, such that the addend is read in as
+	 a 64-bit value (REL32 is a 32-bit relocation, after all).
+	 However, since none of the existing ELF64 MIPS dynamic
+	 loaders seems to care, we don't waste space with these
+	 artificial relocations.  If this turns out to not be true,
+	 mips_elf_allocate_dynamic_relocation() should be tweaked so
+	 as to make room for a pair of dynamic relocations per
+	 invocation if ABI_64_P, and here we should generate an
+	 additional relocation record with R_MIPS_64 by itself for a
+	 NULL symbol before this relocation record.  */
       outrel[1].r_info = ELF_R_INFO (output_bfd, (unsigned long) 0,
 				     ABI_64_P (output_bfd)
 				     ? R_MIPS_64
-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                 aoliva at {redhat dot com, gcc.gnu.org}
CS PhD student at IC-Unicamp        oliva at {lsd dot ic dot unicamp dot br, gnu.org}
Free Software Evangelist                Professional serial bug killer

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