2005-05-28 David Daney <ddaney@avtrex.com>
* elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections): Move calculation of DT_RELSZ to occur after all dynamic relocations are created.
This commit is contained in:
parent
01e94249b6
commit
3133ddbf1d
2 changed files with 55 additions and 12 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2005-05-28 David Daney <ddaney@avtrex.com>
|
||||||
|
|
||||||
|
* elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections): Move
|
||||||
|
calculation of DT_RELSZ to occur after all dynamic relocations
|
||||||
|
are created.
|
||||||
|
|
||||||
2005-05-28 Eli Zaretskii <eliz@gnu.org>
|
2005-05-28 Eli Zaretskii <eliz@gnu.org>
|
||||||
|
|
||||||
* configure.in: Add snprintf and vsnprintf to AC_CHECK_DECLS.
|
* configure.in: Add snprintf and vsnprintf to AC_CHECK_DECLS.
|
||||||
|
|
|
@ -7696,18 +7696,6 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||||
dyn.d_un.d_ptr = s->vma;
|
dyn.d_un.d_ptr = s->vma;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DT_RELSZ:
|
|
||||||
/* Reduce DT_RELSZ to account for any relocations we
|
|
||||||
decided not to make. This is for the n64 irix rld,
|
|
||||||
which doesn't seem to apply any relocations if there
|
|
||||||
are trailing null entries. */
|
|
||||||
s = mips_elf_rel_dyn_section (dynobj, FALSE);
|
|
||||||
dyn.d_un.d_val = (s->reloc_count
|
|
||||||
* (ABI_64_P (output_bfd)
|
|
||||||
? sizeof (Elf64_Mips_External_Rel)
|
|
||||||
: sizeof (Elf32_External_Rel)));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
swap_out_p = FALSE;
|
swap_out_p = FALSE;
|
||||||
break;
|
break;
|
||||||
|
@ -7769,6 +7757,55 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The generation of dynamic relocations for the non-primary gots
|
||||||
|
adds more dynamic relocations. We cannot count them until
|
||||||
|
here. */
|
||||||
|
|
||||||
|
if (elf_hash_table (info)->dynamic_sections_created)
|
||||||
|
{
|
||||||
|
bfd_byte *b;
|
||||||
|
bfd_boolean swap_out_p;
|
||||||
|
|
||||||
|
BFD_ASSERT (sdyn != NULL);
|
||||||
|
|
||||||
|
for (b = sdyn->contents;
|
||||||
|
b < sdyn->contents + sdyn->size;
|
||||||
|
b += MIPS_ELF_DYN_SIZE (dynobj))
|
||||||
|
{
|
||||||
|
Elf_Internal_Dyn dyn;
|
||||||
|
asection *s;
|
||||||
|
|
||||||
|
/* Read in the current dynamic entry. */
|
||||||
|
(*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
|
||||||
|
|
||||||
|
/* Assume that we're going to modify it and write it out. */
|
||||||
|
swap_out_p = TRUE;
|
||||||
|
|
||||||
|
switch (dyn.d_tag)
|
||||||
|
{
|
||||||
|
case DT_RELSZ:
|
||||||
|
/* Reduce DT_RELSZ to account for any relocations we
|
||||||
|
decided not to make. This is for the n64 irix rld,
|
||||||
|
which doesn't seem to apply any relocations if there
|
||||||
|
are trailing null entries. */
|
||||||
|
s = mips_elf_rel_dyn_section (dynobj, FALSE);
|
||||||
|
dyn.d_un.d_val = (s->reloc_count
|
||||||
|
* (ABI_64_P (output_bfd)
|
||||||
|
? sizeof (Elf64_Mips_External_Rel)
|
||||||
|
: sizeof (Elf32_External_Rel)));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
swap_out_p = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (swap_out_p)
|
||||||
|
(*get_elf_backend_data (dynobj)->s->swap_dyn_out)
|
||||||
|
(dynobj, &dyn, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
asection *s;
|
asection *s;
|
||||||
Elf32_compact_rel cpt;
|
Elf32_compact_rel cpt;
|
||||||
|
|
Loading…
Reference in a new issue