* elf32-mips.c (elf_mips_howto_table): Add R_MIPS_JALR.
* elf64-mips.c (mips_elf64_howto_table_rel): Likewise. (mips_elf64_howto_table_rela): Likewise. * elfcode.h (elf_slurp_reloc_table_from_section): New function, split out from ... (elf_slurp_reloc_table): Here. Use it to handle the case where a single section has two associated relocation sections.
This commit is contained in:
parent
6e3db71c77
commit
42fdc50906
2 changed files with 93 additions and 37 deletions
|
@ -1,3 +1,14 @@
|
|||
1999-06-02 Mark Mitchell <Mark Mitchell <mark@codesourcery.com>>
|
||||
|
||||
* elf32-mips.c (elf_mips_howto_table): Add R_MIPS_JALR.
|
||||
* elf64-mips.c (mips_elf64_howto_table_rel): Likewise.
|
||||
(mips_elf64_howto_table_rela): Likewise.
|
||||
|
||||
* elfcode.h (elf_slurp_reloc_table_from_section): New function,
|
||||
split out from ...
|
||||
(elf_slurp_reloc_table): Here. Use it to handle the case where a
|
||||
single section has two associated relocation sections.
|
||||
|
||||
1999-06-02 Mark Salter <msalter@cygnus.com>
|
||||
|
||||
* coffcode.h (coff_set_alignment_hook): Set lma from s_vaddr if
|
||||
|
|
119
bfd/elfcode.h
119
bfd/elfcode.h
|
@ -1,5 +1,6 @@
|
|||
/* ELF executable support for BFD.
|
||||
Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
||||
Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
Written by Fred Fish @ Cygnus Support, from information published
|
||||
in "UNIX System V Release 4, Programmers Guide: ANSI C and
|
||||
|
@ -162,6 +163,9 @@ static void elf_swap_shdr_out
|
|||
|
||||
#define section_from_elf_index bfd_section_from_elf_index
|
||||
|
||||
static boolean elf_slurp_reloc_table_from_section
|
||||
PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type,
|
||||
arelent *, asymbol **, boolean));
|
||||
static boolean elf_slurp_reloc_table
|
||||
PARAMS ((bfd *, asection *, asymbol **, boolean));
|
||||
|
||||
|
@ -1195,50 +1199,27 @@ error_return:
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* Read in and swap the external relocs. */
|
||||
/* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of
|
||||
them. */
|
||||
|
||||
static boolean
|
||||
elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
|
||||
elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
|
||||
relents, symbols, dynamic)
|
||||
bfd *abfd;
|
||||
asection *asect;
|
||||
Elf_Internal_Shdr *rel_hdr;
|
||||
bfd_size_type reloc_count;
|
||||
arelent *relents;
|
||||
asymbol **symbols;
|
||||
boolean dynamic;
|
||||
{
|
||||
struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
|
||||
struct bfd_elf_section_data * const d = elf_section_data (asect);
|
||||
Elf_Internal_Shdr *rel_hdr;
|
||||
bfd_size_type reloc_count;
|
||||
PTR allocated = NULL;
|
||||
bfd_byte *native_relocs;
|
||||
arelent *relents;
|
||||
arelent *relent;
|
||||
unsigned int i;
|
||||
int entsize;
|
||||
|
||||
if (asect->relocation != NULL)
|
||||
return true;
|
||||
|
||||
if (! dynamic)
|
||||
{
|
||||
if ((asect->flags & SEC_RELOC) == 0
|
||||
|| asect->reloc_count == 0)
|
||||
return true;
|
||||
|
||||
rel_hdr = &d->rel_hdr;
|
||||
reloc_count = asect->reloc_count;
|
||||
|
||||
BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
|
||||
&& reloc_count == rel_hdr->sh_size / rel_hdr->sh_entsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (asect->_raw_size == 0)
|
||||
return true;
|
||||
|
||||
rel_hdr = &d->this_hdr;
|
||||
reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
|
||||
}
|
||||
|
||||
allocated = (PTR) bfd_malloc ((size_t) rel_hdr->sh_size);
|
||||
if (allocated == NULL)
|
||||
goto error_return;
|
||||
|
@ -1250,10 +1231,6 @@ elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
|
|||
|
||||
native_relocs = (bfd_byte *) allocated;
|
||||
|
||||
relents = (arelent *) bfd_alloc (abfd, reloc_count * sizeof (arelent));
|
||||
if (relents == NULL)
|
||||
goto error_return;
|
||||
|
||||
entsize = rel_hdr->sh_entsize;
|
||||
BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
|
||||
|| entsize == sizeof (Elf_External_Rela));
|
||||
|
@ -1308,8 +1285,6 @@ elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
|
|||
(*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
|
||||
}
|
||||
|
||||
asect->relocation = relents;
|
||||
|
||||
if (allocated != NULL)
|
||||
free (allocated);
|
||||
|
||||
|
@ -1321,6 +1296,76 @@ elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Read in and swap the external relocs. */
|
||||
|
||||
static boolean
|
||||
elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
|
||||
bfd *abfd;
|
||||
asection *asect;
|
||||
asymbol **symbols;
|
||||
boolean dynamic;
|
||||
{
|
||||
struct bfd_elf_section_data * const d = elf_section_data (asect);
|
||||
Elf_Internal_Shdr *rel_hdr;
|
||||
Elf_Internal_Shdr *rel_hdr2;
|
||||
bfd_size_type reloc_count;
|
||||
bfd_size_type reloc_count2;
|
||||
arelent *relents;
|
||||
|
||||
if (asect->relocation != NULL)
|
||||
return true;
|
||||
|
||||
if (! dynamic)
|
||||
{
|
||||
if ((asect->flags & SEC_RELOC) == 0
|
||||
|| asect->reloc_count == 0)
|
||||
return true;
|
||||
|
||||
rel_hdr = &d->rel_hdr;
|
||||
reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
|
||||
rel_hdr2 = d->rel_hdr2;
|
||||
reloc_count2 = (rel_hdr2
|
||||
? (rel_hdr2->sh_size / rel_hdr2->sh_entsize)
|
||||
: 0);
|
||||
|
||||
BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
|
||||
BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
|
||||
|| (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (asect->_raw_size == 0)
|
||||
return true;
|
||||
|
||||
rel_hdr = &d->this_hdr;
|
||||
reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize;
|
||||
rel_hdr2 = NULL;
|
||||
}
|
||||
|
||||
relents = (arelent *) bfd_alloc (abfd,
|
||||
asect->reloc_count * sizeof (arelent));
|
||||
if (relents == NULL)
|
||||
return false;
|
||||
|
||||
if (!elf_slurp_reloc_table_from_section (abfd, asect,
|
||||
rel_hdr, reloc_count,
|
||||
relents,
|
||||
symbols, dynamic))
|
||||
return false;
|
||||
|
||||
if (rel_hdr2
|
||||
&& !elf_slurp_reloc_table_from_section (abfd, asect,
|
||||
rel_hdr2, reloc_count2,
|
||||
relents + reloc_count,
|
||||
symbols, dynamic))
|
||||
return false;
|
||||
|
||||
|
||||
asect->relocation = relents;
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
static void
|
||||
elf_debug_section (num, hdr)
|
||||
|
|
Loading…
Reference in a new issue