diff options
author | Daniel Jacobowitz <dan@debian.org> | 2005-05-28 22:00:27 +0000 |
---|---|---|
committer | Daniel Jacobowitz <dan@debian.org> | 2005-05-28 22:00:27 +0000 |
commit | 65d9fe02554360cc13ece408064a6673b6933642 (patch) | |
tree | eda83bdd7b17892451efe63318a9ac21e79bce92 | |
parent | c290efe9e07cfca59f9dde51f536a6d7f9bbf4a2 (diff) | |
download | gdb-65d9fe02554360cc13ece408064a6673b6933642.tar.gz |
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.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 61 |
2 files changed, 55 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 32f83dc7c13..86ae224bd46 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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> * configure.in: Add snprintf and vsnprintf to AC_CHECK_DECLS. diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 55d5f75f232..9bae5d58378 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -7696,18 +7696,6 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd, dyn.d_un.d_ptr = s->vma; 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: swap_out_p = FALSE; 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; Elf32_compact_rel cpt; |