* 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.
This commit is contained in:
parent
552f4abf83
commit
908488f19e
2 changed files with 31 additions and 10 deletions
|
@ -1,3 +1,10 @@
|
|||
2003-03-11 Alexandre Oliva <aoliva@redhat.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.
|
||||
|
||||
2003-03-11 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* elf32-ppc.c (ppc_elf_relocate_section): Subtract tls seg vma from
|
||||
|
|
|
@ -3832,7 +3832,6 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
|
|||
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 (output_bfd, info, rel, h, sec,
|
|||
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 (output_bfd, info, rel, h, sec,
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue