diff options
Diffstat (limited to 'bfd/elf64-sparc.c')
-rw-r--r-- | bfd/elf64-sparc.c | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c index e4f04b5..bca09b7 100644 --- a/bfd/elf64-sparc.c +++ b/bfd/elf64-sparc.c @@ -96,6 +96,8 @@ static bfd_boolean sparc64_elf_slurp_one_reloc_table PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, asymbol **, bfd_boolean)); static bfd_boolean sparc64_elf_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **, bfd_boolean)); +static long sparc64_elf_canonicalize_reloc + PARAMS ((bfd *, asection *, arelent **, asymbol **)); static long sparc64_elf_canonicalize_dynamic_reloc PARAMS ((bfd *, arelent **, asymbol **)); static void sparc64_elf_write_relocs PARAMS ((bfd *, asection *, PTR)); @@ -311,6 +313,17 @@ sparc64_elf_info_to_howto (abfd, cache_ptr, dst) cache_ptr->howto = &sparc64_elf_howto_table[ELF64_R_TYPE_ID (dst->r_info)]; } +struct sparc64_elf_section_data +{ + struct bfd_elf_section_data elf; + unsigned int do_relax, reloc_count; +}; + +#define sec_do_relax(sec) \ + ((struct sparc64_elf_section_data *) elf_section_data (sec))->do_relax +#define canon_reloc_count(sec) \ + ((struct sparc64_elf_section_data *) elf_section_data (sec))->reloc_count + /* Due to the way how we handle R_SPARC_OLO10, each entry in a SHT_RELA section can represent up to two relocs, we must tell the user to allocate more space. */ @@ -361,7 +374,7 @@ sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, dynamic) native_relocs = (bfd_byte *) allocated; - relents = asect->relocation + asect->reloc_count; + relents = asect->relocation + canon_reloc_count (asect); entsize = rel_hdr->sh_entsize; BFD_ASSERT (entsize == sizeof (Elf64_External_Rela)); @@ -416,7 +429,7 @@ sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, dynamic) relent->howto = &sparc64_elf_howto_table[ELF64_R_TYPE_ID (rela.r_info)]; } - asect->reloc_count += relent - relents; + canon_reloc_count (asect) += relent - relents; if (allocated != NULL) free (allocated); @@ -478,8 +491,9 @@ sparc64_elf_slurp_reloc_table (abfd, asect, symbols, dynamic) if (asect->relocation == NULL) return FALSE; - /* The sparc64_elf_slurp_one_reloc_table routine increments reloc_count. */ - asect->reloc_count = 0; + /* The sparc64_elf_slurp_one_reloc_table routine increments + canon_reloc_count. */ + canon_reloc_count (asect) = 0; if (!sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, dynamic)) @@ -493,6 +507,32 @@ sparc64_elf_slurp_reloc_table (abfd, asect, symbols, dynamic) return TRUE; } +/* Canonicalize the relocs. */ + +static long +sparc64_elf_canonicalize_reloc (abfd, section, relptr, symbols) + bfd *abfd; + sec_ptr section; + arelent **relptr; + asymbol **symbols; +{ + arelent *tblptr; + unsigned int i; + struct elf_backend_data *bed = get_elf_backend_data (abfd); + + if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE)) + return -1; + + tblptr = section->relocation; + for (i = 0; i < canon_reloc_count (section); i++) + *relptr++ = tblptr++; + + *relptr = NULL; + + return canon_reloc_count (section); +} + + /* Canonicalize the dynamic relocation entries. Note that we return the dynamic relocations as a single block, although they are actually associated with particular sections; the interface, which @@ -528,7 +568,7 @@ sparc64_elf_canonicalize_dynamic_reloc (abfd, storage, syms) if (! sparc64_elf_slurp_reloc_table (abfd, s, syms, TRUE)) return -1; - count = s->reloc_count; + count = canon_reloc_count (s); p = s->relocation; for (i = 0; i < count; i++) *storage++ = p++; @@ -1918,15 +1958,6 @@ sparc64_elf_size_dynamic_sections (output_bfd, info) return TRUE; } -struct sparc64_elf_section_data -{ - struct bfd_elf_section_data elf; - unsigned int do_relax; -}; - -#define sec_do_relax(sec) \ - ((struct sparc64_elf_section_data *) elf_section_data (sec))->do_relax - static bfd_boolean sparc64_elf_new_section_hook (abfd, sec) bfd *abfd; @@ -3177,6 +3208,8 @@ const struct elf_size_info sparc64_elf_size_info = sparc64_elf_get_reloc_upper_bound #define bfd_elf64_get_dynamic_reloc_upper_bound \ sparc64_elf_get_dynamic_reloc_upper_bound +#define bfd_elf64_canonicalize_reloc \ + sparc64_elf_canonicalize_reloc #define bfd_elf64_canonicalize_dynamic_reloc \ sparc64_elf_canonicalize_dynamic_reloc #define bfd_elf64_bfd_reloc_type_lookup \ |