* elf-bfd.h (elf_link_hash_table): Add hplt field.
	* elflink.c (_bfd_elf_create_dynamic_sections): Initialize it.
	* elf-m10300.c (_bfd_mn10300_elf_create_got_section): Likewise.
	* elf32-frv.c (_frv_create_got_section): Likewise.
	* elf32-m32r.c (m32r_elf_create_dynamic_sections): Likewise.
	* elf32-sh.c (sh_elf_create_dynamic_sections): Likewise.
	* elf64-alpha.c (elf64_alpha_create_dynamic_sections): Likewise.
	* elf64-sh64.c (sh64_elf64_create_dynamic_sections): Likewise.
	* elf32-i386.c (elf_i386_link_hash_table): Remove hgot and hplt.
	(elf_i386_link_hash_table_create): Don't initialize them.
	(elf_i386_size_dynamic_sections): Use the generic ELF hplt and
	hgot fields.
	(elf_i386_finish_dynamic_symbol): Likewise.
	* elf32-ppc.c (ppc_elf_link_hash_table): Remove hplt.
	(ppc_elf_size_dynamic_sections): Use the generic ELF hplt fields.
	(ppc_elf_finish_dynamic_symbol): Likewise.
This commit is contained in:
Richard Sandiford
2006-02-25 09:23:30 +00:00
parent 637d6690a8
commit 7325306f39
11 changed files with 83 additions and 68 deletions

View File

@ -1,3 +1,22 @@
2006-02-25 Richard Sandiford <richard@codesourcery.com>
* elf-bfd.h (elf_link_hash_table): Add hplt field.
* elflink.c (_bfd_elf_create_dynamic_sections): Initialize it.
* elf-m10300.c (_bfd_mn10300_elf_create_got_section): Likewise.
* elf32-frv.c (_frv_create_got_section): Likewise.
* elf32-m32r.c (m32r_elf_create_dynamic_sections): Likewise.
* elf32-sh.c (sh_elf_create_dynamic_sections): Likewise.
* elf64-alpha.c (elf64_alpha_create_dynamic_sections): Likewise.
* elf64-sh64.c (sh64_elf64_create_dynamic_sections): Likewise.
* elf32-i386.c (elf_i386_link_hash_table): Remove hgot and hplt.
(elf_i386_link_hash_table_create): Don't initialize them.
(elf_i386_size_dynamic_sections): Use the generic ELF hplt and
hgot fields.
(elf_i386_finish_dynamic_symbol): Likewise.
* elf32-ppc.c (ppc_elf_link_hash_table): Remove hplt.
(ppc_elf_size_dynamic_sections): Use the generic ELF hplt fields.
(ppc_elf_finish_dynamic_symbol): Likewise.
2006-02-24 DJ Delorie <dj@redhat.com> 2006-02-24 DJ Delorie <dj@redhat.com>
* elf32-m32c.c (m32c_elf_howto_table): Add relaxation relocs. * elf32-m32c.c (m32c_elf_howto_table): Add relaxation relocs.

View File

@ -378,6 +378,9 @@ struct elf_link_hash_table
/* The _GLOBAL_OFFSET_TABLE_ symbol. */ /* The _GLOBAL_OFFSET_TABLE_ symbol. */
struct elf_link_hash_entry *hgot; struct elf_link_hash_entry *hgot;
/* The _PROCEDURE_LINKAGE_TABLE_ symbol. */
struct elf_link_hash_entry *hplt;
/* A pointer to information used to merge SEC_MERGE sections. */ /* A pointer to information used to merge SEC_MERGE sections. */
void *merge_info; void *merge_info;

View File

@ -582,10 +582,14 @@ _bfd_mn10300_elf_create_got_section (abfd, info)
/* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
.plt section. */ .plt section. */
if (bed->want_plt_sym if (bed->want_plt_sym)
&& !_bfd_elf_define_linkage_sym (abfd, info, s, {
"_PROCEDURE_LINKAGE_TABLE_")) h = _bfd_elf_define_linkage_sym (abfd, info, s,
return FALSE; "_PROCEDURE_LINKAGE_TABLE_");
elf_hash_table (info)->hplt = h;
if (h == NULL)
return FALSE;
}
s = bfd_make_section_with_flags (abfd, ".got", flags); s = bfd_make_section_with_flags (abfd, ".got", flags);
if (s == NULL if (s == NULL

View File

@ -4398,10 +4398,14 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
/* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
.plt section. */ .plt section. */
if (bed->want_plt_sym if (bed->want_plt_sym)
&& !_bfd_elf_define_linkage_sym (abfd, info, s, {
"_PROCEDURE_LINKAGE_TABLE_")) h = _bfd_elf_define_linkage_sym (abfd, info, s,
return FALSE; "_PROCEDURE_LINKAGE_TABLE_");
elf_hash_table (info)->hplt = h;
if (h == NULL)
return FALSE;
}
/* FRV-specific: we want rel relocations for the plt. */ /* FRV-specific: we want rel relocations for the plt. */
s = bfd_make_section_with_flags (abfd, ".rel.plt", s = bfd_make_section_with_flags (abfd, ".rel.plt",

View File

@ -647,9 +647,6 @@ struct elf_i386_link_hash_table
/* The (unloaded but important) .rel.plt.unloaded section on VxWorks. */ /* The (unloaded but important) .rel.plt.unloaded section on VxWorks. */
asection *srelplt2; asection *srelplt2;
/* Short-cuts to frequently used symbols for VxWorks targets. */
struct elf_link_hash_entry *hgot, *hplt;
/* True if the target system is VxWorks. */ /* True if the target system is VxWorks. */
int is_vxworks; int is_vxworks;
@ -739,8 +736,6 @@ elf_i386_link_hash_table_create (bfd *abfd)
ret->sym_sec.abfd = NULL; ret->sym_sec.abfd = NULL;
ret->is_vxworks = 0; ret->is_vxworks = 0;
ret->srelplt2 = NULL; ret->srelplt2 = NULL;
ret->hgot = NULL;
ret->hplt = NULL;
ret->plt0_pad_byte = 0; ret->plt0_pad_byte = 0;
return &ret->elf.root; return &ret->elf.root;
@ -2003,23 +1998,17 @@ elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
if (htab->is_vxworks) if (htab->is_vxworks)
{ {
/* Save the GOT and PLT symbols in the hash table for easy access. /* Mark the GOT and PLT symbols as having relocations; they might
Mark them as having relocations; they might not, but we won't not, but we won't know for sure until we build the GOT in
know for sure until we build the GOT in finish_dynamic_symbol. */ finish_dynamic_symbol. */
if (htab->elf.hgot)
htab->hgot = elf_link_hash_lookup (elf_hash_table (info), htab->elf.hgot->indx = -2;
"_GLOBAL_OFFSET_TABLE_", if (htab->elf.hplt)
FALSE, FALSE, FALSE); {
if (htab->hgot) htab->elf.hplt->indx = -2;
htab->hgot->indx = -2; if (htab->splt->flags & SEC_CODE)
htab->hplt = elf_link_hash_lookup (elf_hash_table (info), htab->elf.hplt->type = STT_FUNC;
"_PROCEDURE_LINKAGE_TABLE_", }
FALSE, FALSE, FALSE);
if (htab->hplt)
htab->hplt->indx = -2;
if (htab->is_vxworks && htab->hplt && htab->splt->flags & SEC_CODE)
htab->hplt->type = STT_FUNC;
} }
/* Allocate global sym .plt and .got entries, and space for global /* Allocate global sym .plt and .got entries, and space for global
@ -2055,7 +2044,7 @@ elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
we've exported dynamic symbols from them we must leave them. we've exported dynamic symbols from them we must leave them.
It's too late to tell BFD to get rid of the symbols. */ It's too late to tell BFD to get rid of the symbols. */
if (htab->hplt != NULL) if (htab->elf.hplt != NULL)
strip_section = FALSE; strip_section = FALSE;
} }
else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0) else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
@ -3524,7 +3513,7 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
rel.r_offset = (htab->splt->output_section->vma rel.r_offset = (htab->splt->output_section->vma
+ htab->splt->output_offset + htab->splt->output_offset
+ h->plt.offset + 2), + h->plt.offset + 2),
rel.r_info = ELF32_R_INFO (htab->hgot->indx, R_386_32); rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
/* Create the R_386_32 relocation referencing the beginning of /* Create the R_386_32 relocation referencing the beginning of
@ -3532,7 +3521,7 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
rel.r_offset = (htab->sgotplt->output_section->vma rel.r_offset = (htab->sgotplt->output_section->vma
+ htab->sgotplt->output_offset + htab->sgotplt->output_offset
+ got_offset); + got_offset);
rel.r_info = ELF32_R_INFO (htab->hplt->indx, R_386_32); rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, bfd_elf32_swap_reloc_out (output_bfd, &rel,
loc + sizeof (Elf32_External_Rel)); loc + sizeof (Elf32_External_Rel));
} }
@ -3786,28 +3775,21 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
if (htab->is_vxworks) if (htab->is_vxworks)
{ {
Elf_Internal_Rela rel; Elf_Internal_Rela rel;
struct elf_link_hash_entry *hgot;
/* The VxWorks GOT is relocated by the dynamic linker.
Therefore, we must emit relocations rather than
simply computing the values now. */
hgot = elf_link_hash_lookup (elf_hash_table (info),
"_GLOBAL_OFFSET_TABLE_",
FALSE, FALSE, FALSE);
/* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4. /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
On IA32 we use REL relocations so the addend goes in On IA32 we use REL relocations so the addend goes in
the PLT directly. */ the PLT directly. */
rel.r_offset = (htab->splt->output_section->vma rel.r_offset = (htab->splt->output_section->vma
+ htab->splt->output_offset + htab->splt->output_offset
+ 2); + 2);
rel.r_info = ELF32_R_INFO (hgot->indx, R_386_32); rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, bfd_elf32_swap_reloc_out (output_bfd, &rel,
htab->srelplt2->contents); htab->srelplt2->contents);
/* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */ /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
rel.r_offset = (htab->splt->output_section->vma rel.r_offset = (htab->splt->output_section->vma
+ htab->splt->output_offset + htab->splt->output_offset
+ 8); + 8);
rel.r_info = ELF32_R_INFO (hgot->indx, R_386_32); rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, bfd_elf32_swap_reloc_out (output_bfd, &rel,
htab->srelplt2->contents + htab->srelplt2->contents +
sizeof (Elf32_External_Rel)); sizeof (Elf32_External_Rel));
@ -3835,12 +3817,12 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
{ {
Elf_Internal_Rela rel; Elf_Internal_Rela rel;
bfd_elf32_swap_reloc_in (output_bfd, p, &rel); bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
rel.r_info = ELF32_R_INFO (htab->hgot->indx, R_386_32); rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, p); bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
p += sizeof (Elf32_External_Rel); p += sizeof (Elf32_External_Rel);
bfd_elf32_swap_reloc_in (output_bfd, p, &rel); bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
rel.r_info = ELF32_R_INFO (htab->hplt->indx, R_386_32); rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, p); bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
p += sizeof (Elf32_External_Rel); p += sizeof (Elf32_External_Rel);
} }

View File

@ -1668,6 +1668,7 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
h = (struct elf_link_hash_entry *) bh; h = (struct elf_link_hash_entry *) bh;
h->def_regular = 1; h->def_regular = 1;
h->type = STT_OBJECT; h->type = STT_OBJECT;
htab->root.hplt = h;
if (info->shared if (info->shared
&& ! bfd_elf_link_record_dynamic_symbol (info, h)) && ! bfd_elf_link_record_dynamic_symbol (info, h))

View File

@ -2365,9 +2365,6 @@ struct ppc_elf_link_hash_table
/* The .got.plt section (VxWorks only)*/ /* The .got.plt section (VxWorks only)*/
asection *sgotplt; asection *sgotplt;
/* Short-cuts to frequently used symbols on VxWorks targets. */
struct elf_link_hash_entry *hplt;
/* True if the target system is VxWorks. */ /* True if the target system is VxWorks. */
int is_vxworks; int is_vxworks;
@ -4762,21 +4759,17 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
if (htab->is_vxworks) if (htab->is_vxworks)
{ {
/* Save the PLT symbol in the hash table for easy access. /* Mark the GOT and PLT symbols as having relocations; they might
Mark GOT and PLT syms as having relocations; they might not, not, but we won't know for sure until we build the GOT in
but we won't know for sure until we build the GOT in
finish_dynamic_symbol. */ finish_dynamic_symbol. */
if (htab->elf.hgot) if (htab->elf.hgot)
htab->elf.hgot->indx = -2; htab->elf.hgot->indx = -2;
htab->hplt = elf_link_hash_lookup (elf_hash_table (info), if (htab->elf.hplt)
"_PROCEDURE_LINKAGE_TABLE_", {
FALSE, FALSE, FALSE); htab->elf.hplt->indx = -2;
if (htab->hplt) if (htab->plt->flags & SEC_CODE)
htab->hplt->indx = -2; htab->elf.hplt->type = STT_FUNC;
/* If the PLT is executable then give the symbol function type. */ }
if (htab->hplt && htab->plt->flags & SEC_CODE)
htab->hplt->type = STT_FUNC;
} }
/* Allocate space for global sym dynamic relocs. */ /* Allocate space for global sym dynamic relocs. */
@ -4867,7 +4860,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
/* We'd like to strip these sections if they aren't needed, but if /* We'd like to strip these sections if they aren't needed, but if
we've exported dynamic symbols from them we must leave them. we've exported dynamic symbols from them we must leave them.
It's too late to tell BFD to get rid of the symbols. */ It's too late to tell BFD to get rid of the symbols. */
if ((s == htab->plt || s == htab->got) && htab->hplt != NULL) if ((s == htab->plt || s == htab->got) && htab->elf.hplt != NULL)
strip_section = FALSE; strip_section = FALSE;
/* Strip this section if we don't need it; see the /* Strip this section if we don't need it; see the
comment below. */ comment below. */
@ -6880,7 +6873,7 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
rela.r_offset = (htab->sgotplt->output_section->vma rela.r_offset = (htab->sgotplt->output_section->vma
+ htab->sgotplt->output_offset + htab->sgotplt->output_offset
+ got_offset); + got_offset);
rela.r_info = ELF32_R_INFO (htab->hplt->indx, rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
R_PPC_ADDR32); R_PPC_ADDR32);
rela.r_addend = ent->plt.offset + 16; rela.r_addend = ent->plt.offset + 16;
bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
@ -7248,7 +7241,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
loc += sizeof (Elf32_External_Rela); loc += sizeof (Elf32_External_Rela);
bfd_elf32_swap_reloc_in (output_bfd, loc, &rel); bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
rel.r_info = ELF32_R_INFO (htab->hplt->indx, R_PPC_ADDR32); rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
loc += sizeof (Elf32_External_Rela); loc += sizeof (Elf32_External_Rela);
} }

View File

@ -3726,6 +3726,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
h = (struct elf_link_hash_entry *) bh; h = (struct elf_link_hash_entry *) bh;
h->def_regular = 1; h->def_regular = 1;
h->type = STT_OBJECT; h->type = STT_OBJECT;
htab->root.hplt = h;
if (info->shared if (info->shared
&& ! bfd_elf_link_record_dynamic_symbol (info, h)) && ! bfd_elf_link_record_dynamic_symbol (info, h))

View File

@ -1244,8 +1244,10 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
/* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
.plt section. */ .plt section. */
if (!_bfd_elf_define_linkage_sym (abfd, info, s, h = _bfd_elf_define_linkage_sym (abfd, info, s,
"_PROCEDURE_LINKAGE_TABLE_")) "_PROCEDURE_LINKAGE_TABLE_");
elf_hash_table (info)->hplt = h;
if (h == NULL)
return FALSE; return FALSE;
flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY

View File

@ -3240,6 +3240,7 @@ sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
h = (struct elf_link_hash_entry *) bh; h = (struct elf_link_hash_entry *) bh;
h->def_regular = 1; h->def_regular = 1;
h->type = STT_OBJECT; h->type = STT_OBJECT;
elf_hash_table (info)->hplt = h;
if (info->shared if (info->shared
&& ! bfd_elf_link_record_dynamic_symbol (info, h)) && ! bfd_elf_link_record_dynamic_symbol (info, h))

View File

@ -263,6 +263,7 @@ bfd_boolean
_bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
{ {
flagword flags, pltflags; flagword flags, pltflags;
struct elf_link_hash_entry *h;
asection *s; asection *s;
const struct elf_backend_data *bed = get_elf_backend_data (abfd); const struct elf_backend_data *bed = get_elf_backend_data (abfd);
@ -288,10 +289,14 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
/* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
.plt section. */ .plt section. */
if (bed->want_plt_sym if (bed->want_plt_sym)
&& !_bfd_elf_define_linkage_sym (abfd, info, s, {
"_PROCEDURE_LINKAGE_TABLE_")) h = _bfd_elf_define_linkage_sym (abfd, info, s,
return FALSE; "_PROCEDURE_LINKAGE_TABLE_");
elf_hash_table (info)->hplt = h;
if (h == NULL)
return FALSE;
}
s = bfd_make_section_with_flags (abfd, s = bfd_make_section_with_flags (abfd,
(bed->default_use_rela_p (bed->default_use_rela_p