This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
mips rel32/64 to section symbol
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: binutils at sources dot redhat dot com
- Date: 10 Mar 2003 23:48:36 -0300
- Subject: mips rel32/64 to section symbol
- Organization: GCC Team, Red Hat
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