* elf64-sparc.c (struct sparc64_elf_section_data): Add reloc_count

field.
	(canon_reloc_count): Define.
	(sparc64_elf_slurp_one_reloc_table, sparc64_elf_slurp_reloc_table,
	sparc64_elf_canonicalize_dynamic_reloc): Use it instead of
	reloc_count.
	(sparc64_elf_canonicalize_reloc): New routine.
	(bfd_elf64_canonicalize_reloc): Define.
This commit is contained in:
Jakub Jelinek 2003-03-19 09:26:51 +00:00
parent b006a9e9ba
commit 3e1d7f19ec
2 changed files with 58 additions and 14 deletions

View file

@ -1,3 +1,14 @@
2003-03-19 Jakub Jelinek <jakub@redhat.com>
* elf64-sparc.c (struct sparc64_elf_section_data): Add reloc_count
field.
(canon_reloc_count): Define.
(sparc64_elf_slurp_one_reloc_table, sparc64_elf_slurp_reloc_table,
sparc64_elf_canonicalize_dynamic_reloc): Use it instead of
reloc_count.
(sparc64_elf_canonicalize_reloc): New routine.
(bfd_elf64_canonicalize_reloc): Define.
2003-03-18 Jakub Jelinek <jakub@redhat.com> 2003-03-18 Jakub Jelinek <jakub@redhat.com>
* elfxx-ia64.c (elfNN_ia64_relax_section): Handle relaxation * elfxx-ia64.c (elfNN_ia64_relax_section): Handle relaxation

View file

@ -96,6 +96,8 @@ static bfd_boolean sparc64_elf_slurp_one_reloc_table
PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, asymbol **, bfd_boolean)); PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, asymbol **, bfd_boolean));
static bfd_boolean sparc64_elf_slurp_reloc_table static bfd_boolean sparc64_elf_slurp_reloc_table
PARAMS ((bfd *, asection *, asymbol **, bfd_boolean)); PARAMS ((bfd *, asection *, asymbol **, bfd_boolean));
static long sparc64_elf_canonicalize_reloc
PARAMS ((bfd *, asection *, arelent **, asymbol **));
static long sparc64_elf_canonicalize_dynamic_reloc static long sparc64_elf_canonicalize_dynamic_reloc
PARAMS ((bfd *, arelent **, asymbol **)); PARAMS ((bfd *, arelent **, asymbol **));
static void sparc64_elf_write_relocs PARAMS ((bfd *, asection *, PTR)); 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)]; 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 /* 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 section can represent up to two relocs, we must tell the user to allocate
more space. */ more space. */
@ -361,7 +374,7 @@ sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, dynamic)
native_relocs = (bfd_byte *) allocated; native_relocs = (bfd_byte *) allocated;
relents = asect->relocation + asect->reloc_count; relents = asect->relocation + canon_reloc_count (asect);
entsize = rel_hdr->sh_entsize; entsize = rel_hdr->sh_entsize;
BFD_ASSERT (entsize == sizeof (Elf64_External_Rela)); 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)]; 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) if (allocated != NULL)
free (allocated); free (allocated);
@ -478,8 +491,9 @@ sparc64_elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
if (asect->relocation == NULL) if (asect->relocation == NULL)
return FALSE; return FALSE;
/* The sparc64_elf_slurp_one_reloc_table routine increments reloc_count. */ /* The sparc64_elf_slurp_one_reloc_table routine increments
asect->reloc_count = 0; canon_reloc_count. */
canon_reloc_count (asect) = 0;
if (!sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, if (!sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols,
dynamic)) dynamic))
@ -493,6 +507,32 @@ sparc64_elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
return TRUE; 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 /* Canonicalize the dynamic relocation entries. Note that we return
the dynamic relocations as a single block, although they are the dynamic relocations as a single block, although they are
actually associated with particular sections; the interface, which 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)) if (! sparc64_elf_slurp_reloc_table (abfd, s, syms, TRUE))
return -1; return -1;
count = s->reloc_count; count = canon_reloc_count (s);
p = s->relocation; p = s->relocation;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
*storage++ = p++; *storage++ = p++;
@ -1918,15 +1958,6 @@ sparc64_elf_size_dynamic_sections (output_bfd, info)
return TRUE; 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 static bfd_boolean
sparc64_elf_new_section_hook (abfd, sec) sparc64_elf_new_section_hook (abfd, sec)
bfd *abfd; bfd *abfd;
@ -3177,6 +3208,8 @@ const struct elf_size_info sparc64_elf_size_info =
sparc64_elf_get_reloc_upper_bound sparc64_elf_get_reloc_upper_bound
#define bfd_elf64_get_dynamic_reloc_upper_bound \ #define bfd_elf64_get_dynamic_reloc_upper_bound \
sparc64_elf_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 \ #define bfd_elf64_canonicalize_dynamic_reloc \
sparc64_elf_canonicalize_dynamic_reloc sparc64_elf_canonicalize_dynamic_reloc
#define bfd_elf64_bfd_reloc_type_lookup \ #define bfd_elf64_bfd_reloc_type_lookup \