mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-03 03:07:26 +08:00
* elf32-ppc.c (elf_linker_section_pointers_t): Remove
written_address_p. (ppc_elf_create_linker_section): Don't try to reuse existing section. (elf_create_pointer_linker_section): Delete info parm. Don't make h dynamic. Don't set written_address_p. (ppc_elf_check_relocs): Adjust ppc_elf_create_linker_section calls. (bfd_put_ptr): Delete. (elf_finish_pointer_linker_section): Remove output_bfd and info parms. Always write section contents. Assert global sym is def_regular. Use offset bottom bit as a written flag. (ppc_elf_relocate_section): Adjust elf_finish_pointer_linker_section calls.
This commit is contained in:
@ -1,3 +1,18 @@
|
|||||||
|
2005-03-22 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elf32-ppc.c (elf_linker_section_pointers_t): Remove
|
||||||
|
written_address_p.
|
||||||
|
(ppc_elf_create_linker_section): Don't try to reuse existing section.
|
||||||
|
(elf_create_pointer_linker_section): Delete info parm. Don't make
|
||||||
|
h dynamic. Don't set written_address_p.
|
||||||
|
(ppc_elf_check_relocs): Adjust ppc_elf_create_linker_section calls.
|
||||||
|
(bfd_put_ptr): Delete.
|
||||||
|
(elf_finish_pointer_linker_section): Remove output_bfd and info parms.
|
||||||
|
Always write section contents. Assert global sym is def_regular.
|
||||||
|
Use offset bottom bit as a written flag.
|
||||||
|
(ppc_elf_relocate_section): Adjust elf_finish_pointer_linker_section
|
||||||
|
calls.
|
||||||
|
|
||||||
2005-03-22 Alan Modra <amodra@bigpond.net.au>
|
2005-03-22 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf32-ppc.c (ppc_elf_set_sdata_syms): New function, extracted from..
|
* elf32-ppc.c (ppc_elf_set_sdata_syms): New function, extracted from..
|
||||||
|
120
bfd/elf32-ppc.c
120
bfd/elf32-ppc.c
@ -1532,8 +1532,6 @@ typedef struct elf_linker_section_pointers
|
|||||||
bfd_vma addend;
|
bfd_vma addend;
|
||||||
/* which linker section this is */
|
/* which linker section this is */
|
||||||
elf_linker_section_t *lsect;
|
elf_linker_section_t *lsect;
|
||||||
/* whether address was written yet */
|
|
||||||
bfd_boolean written_address_p;
|
|
||||||
} elf_linker_section_pointers_t;
|
} elf_linker_section_pointers_t;
|
||||||
|
|
||||||
struct ppc_elf_obj_tdata
|
struct ppc_elf_obj_tdata
|
||||||
@ -2417,27 +2415,12 @@ ppc_elf_create_linker_section (bfd *abfd,
|
|||||||
if (!htab->elf.dynobj)
|
if (!htab->elf.dynobj)
|
||||||
htab->elf.dynobj = abfd;
|
htab->elf.dynobj = abfd;
|
||||||
|
|
||||||
/* See if the section already exists. */
|
s = bfd_make_section_anyway (htab->elf.dynobj, lsect->name);
|
||||||
s = bfd_get_section_by_name (htab->elf.dynobj, lsect->name);
|
if (s == NULL
|
||||||
if (s == NULL || (s->flags & flags) != flags)
|
|| !bfd_set_section_flags (htab->elf.dynobj, s, flags)
|
||||||
{
|
|| !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
|
||||||
s = bfd_make_section_anyway (htab->elf.dynobj, lsect->name);
|
|
||||||
if (s == NULL
|
|
||||||
|| !bfd_set_section_flags (htab->elf.dynobj, s, flags))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
lsect->section = s;
|
|
||||||
|
|
||||||
if (bfd_get_section_alignment (htab->elf.dynobj, s) < 2
|
|
||||||
&& !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
lsect->section = s;
|
||||||
s->size = align_power (s->size, 2);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf (stderr, "Creating section %s, current size = %ld\n",
|
|
||||||
lsect->name, (long) s->size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -2461,7 +2444,6 @@ elf_find_pointer_linker_section
|
|||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
elf_create_pointer_linker_section (bfd *abfd,
|
elf_create_pointer_linker_section (bfd *abfd,
|
||||||
struct bfd_link_info *info,
|
|
||||||
elf_linker_section_t *lsect,
|
elf_linker_section_t *lsect,
|
||||||
struct elf_link_hash_entry *h,
|
struct elf_link_hash_entry *h,
|
||||||
const Elf_Internal_Rela *rel)
|
const Elf_Internal_Rela *rel)
|
||||||
@ -2486,12 +2468,6 @@ elf_create_pointer_linker_section (bfd *abfd,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
ptr_linker_section_ptr = &eh->linker_section_pointer;
|
ptr_linker_section_ptr = &eh->linker_section_pointer;
|
||||||
/* Make sure this symbol is output as a dynamic symbol. */
|
|
||||||
if (h->dynindx == -1)
|
|
||||||
{
|
|
||||||
if (! bfd_elf_link_record_dynamic_symbol (info, h))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2534,7 +2510,6 @@ elf_create_pointer_linker_section (bfd *abfd,
|
|||||||
linker_section_ptr->next = *ptr_linker_section_ptr;
|
linker_section_ptr->next = *ptr_linker_section_ptr;
|
||||||
linker_section_ptr->addend = rel->r_addend;
|
linker_section_ptr->addend = rel->r_addend;
|
||||||
linker_section_ptr->lsect = lsect;
|
linker_section_ptr->lsect = lsect;
|
||||||
linker_section_ptr->written_address_p = FALSE;
|
|
||||||
*ptr_linker_section_ptr = linker_section_ptr;
|
*ptr_linker_section_ptr = linker_section_ptr;
|
||||||
|
|
||||||
linker_section_ptr->offset = lsect->section->size;
|
linker_section_ptr->offset = lsect->section->size;
|
||||||
@ -2719,8 +2694,8 @@ ppc_elf_check_relocs (bfd *abfd,
|
|||||||
&& !ppc_elf_create_linker_section (abfd, info, 0,
|
&& !ppc_elf_create_linker_section (abfd, info, 0,
|
||||||
&htab->sdata[0]))
|
&htab->sdata[0]))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!elf_create_pointer_linker_section (abfd, info,
|
if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
|
||||||
&htab->sdata[0], h, rel))
|
h, rel))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2735,8 +2710,8 @@ ppc_elf_check_relocs (bfd *abfd,
|
|||||||
&& !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
|
&& !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
|
||||||
&htab->sdata[1]))
|
&htab->sdata[1]))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!elf_create_pointer_linker_section (abfd, info,
|
if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
|
||||||
&htab->sdata[1], h, rel))
|
h, rel))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -4640,14 +4615,10 @@ ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define bfd_put_ptr(BFD, VAL, ADDR) bfd_put_32 (BFD, VAL, ADDR)
|
|
||||||
|
|
||||||
/* Fill in the address for a pointer generated in a linker section. */
|
/* Fill in the address for a pointer generated in a linker section. */
|
||||||
|
|
||||||
static bfd_vma
|
static bfd_vma
|
||||||
elf_finish_pointer_linker_section (bfd *output_bfd,
|
elf_finish_pointer_linker_section (bfd *input_bfd,
|
||||||
bfd *input_bfd,
|
|
||||||
struct bfd_link_info *info,
|
|
||||||
elf_linker_section_t *lsect,
|
elf_linker_section_t *lsect,
|
||||||
struct elf_link_hash_entry *h,
|
struct elf_link_hash_entry *h,
|
||||||
bfd_vma relocation,
|
bfd_vma relocation,
|
||||||
@ -4663,60 +4634,35 @@ elf_finish_pointer_linker_section (bfd *output_bfd,
|
|||||||
struct ppc_elf_link_hash_entry *eh;
|
struct ppc_elf_link_hash_entry *eh;
|
||||||
|
|
||||||
eh = (struct ppc_elf_link_hash_entry *) h;
|
eh = (struct ppc_elf_link_hash_entry *) h;
|
||||||
linker_section_ptr
|
BFD_ASSERT (eh->elf.def_regular);
|
||||||
= elf_find_pointer_linker_section (eh->linker_section_pointer,
|
linker_section_ptr = eh->linker_section_pointer;
|
||||||
rel->r_addend,
|
|
||||||
lsect);
|
|
||||||
|
|
||||||
BFD_ASSERT (linker_section_ptr != NULL);
|
|
||||||
|
|
||||||
if (! elf_hash_table (info)->dynamic_sections_created
|
|
||||||
|| (info->shared
|
|
||||||
&& info->symbolic
|
|
||||||
&& h->def_regular))
|
|
||||||
{
|
|
||||||
/* This is actually a static link, or it is a
|
|
||||||
-Bsymbolic link and the symbol is defined
|
|
||||||
locally. We must initialize this entry in the
|
|
||||||
global section.
|
|
||||||
|
|
||||||
When doing a dynamic link, we create a .rela.<xxx>
|
|
||||||
relocation entry to initialize the value. This
|
|
||||||
is done in the finish_dynamic_symbol routine. */
|
|
||||||
if (!linker_section_ptr->written_address_p)
|
|
||||||
{
|
|
||||||
linker_section_ptr->written_address_p = TRUE;
|
|
||||||
bfd_put_ptr (output_bfd,
|
|
||||||
relocation + linker_section_ptr->addend,
|
|
||||||
(lsect->section->contents
|
|
||||||
+ linker_section_ptr->offset));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Handle local symbol. */
|
/* Handle local symbol. */
|
||||||
unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
|
unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
|
||||||
|
|
||||||
BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
|
BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
|
||||||
BFD_ASSERT (elf_local_ptr_offsets (input_bfd)[r_symndx] != NULL);
|
linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
|
||||||
linker_section_ptr = (elf_find_pointer_linker_section
|
}
|
||||||
(elf_local_ptr_offsets (input_bfd)[r_symndx],
|
|
||||||
rel->r_addend,
|
|
||||||
lsect));
|
|
||||||
|
|
||||||
BFD_ASSERT (linker_section_ptr != NULL);
|
linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
|
||||||
|
rel->r_addend,
|
||||||
|
lsect);
|
||||||
|
BFD_ASSERT (linker_section_ptr != NULL);
|
||||||
|
|
||||||
/* Write out pointer if it hasn't been rewritten out before. */
|
/* Offset will always be a multiple of four, so use the bottom bit
|
||||||
if (!linker_section_ptr->written_address_p)
|
as a "written" flag. */
|
||||||
{
|
if ((linker_section_ptr->offset & 1) == 0)
|
||||||
linker_section_ptr->written_address_p = TRUE;
|
{
|
||||||
bfd_put_ptr (output_bfd, relocation + linker_section_ptr->addend,
|
bfd_put_32 (lsect->section->owner,
|
||||||
lsect->section->contents + linker_section_ptr->offset);
|
relocation + linker_section_ptr->addend,
|
||||||
}
|
lsect->section->contents + linker_section_ptr->offset);
|
||||||
|
linker_section_ptr->offset += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
relocation = (lsect->section->output_offset
|
relocation = (lsect->section->output_offset
|
||||||
+ linker_section_ptr->offset
|
+ linker_section_ptr->offset - 1
|
||||||
- 0x8000);
|
- 0x8000);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -5602,18 +5548,16 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
|||||||
case R_PPC_EMB_SDAI16:
|
case R_PPC_EMB_SDAI16:
|
||||||
BFD_ASSERT (htab->sdata[0].section != NULL);
|
BFD_ASSERT (htab->sdata[0].section != NULL);
|
||||||
relocation
|
relocation
|
||||||
= elf_finish_pointer_linker_section (output_bfd, input_bfd, info,
|
= elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
|
||||||
&htab->sdata[0], h,
|
h, relocation, rel);
|
||||||
relocation, rel);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Indirect .sdata2 relocation. */
|
/* Indirect .sdata2 relocation. */
|
||||||
case R_PPC_EMB_SDA2I16:
|
case R_PPC_EMB_SDA2I16:
|
||||||
BFD_ASSERT (htab->sdata[1].section != NULL);
|
BFD_ASSERT (htab->sdata[1].section != NULL);
|
||||||
relocation
|
relocation
|
||||||
= elf_finish_pointer_linker_section (output_bfd, input_bfd, info,
|
= elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
|
||||||
&htab->sdata[1], h,
|
h, relocation, rel);
|
||||||
relocation, rel);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Handle the TOC16 reloc. We want to use the offset within the .got
|
/* Handle the TOC16 reloc. We want to use the offset within the .got
|
||||||
|
Reference in New Issue
Block a user