* 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:
Alan Modra
2005-03-22 13:32:57 +00:00
parent 41772c33ca
commit 76750a2f8d
2 changed files with 47 additions and 88 deletions

View File

@ -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..

View File

@ -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