2009-06-16 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-ia64.c (elfNN_ia64_link_hash_table): Remove got_sec, rel_got_sec and plt_sec. (elfNN_ia64_relax_section): Updated. (elfNN_ia64_create_dynamic_sections): Likewise. (get_got): Likewise. (allocate_dynrel_entries): Likewise. (elfNN_ia64_size_dynamic_sections): Likewise. (set_got_entry): Likewise. (elfNN_ia64_choose_gp): Likewise. (elfNN_ia64_relocate_section): Likewise. (elfNN_ia64_finish_dynamic_symbol): Likewise. (elfNN_ia64_finish_dynamic_sections): Likewise.
This commit is contained in:
parent
be3e406de8
commit
cc3bd654e4
@ -1,3 +1,18 @@
|
||||
2009-06-16 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elfxx-ia64.c (elfNN_ia64_link_hash_table): Remove got_sec,
|
||||
rel_got_sec and plt_sec.
|
||||
(elfNN_ia64_relax_section): Updated.
|
||||
(elfNN_ia64_create_dynamic_sections): Likewise.
|
||||
(get_got): Likewise.
|
||||
(allocate_dynrel_entries): Likewise.
|
||||
(elfNN_ia64_size_dynamic_sections): Likewise.
|
||||
(set_got_entry): Likewise.
|
||||
(elfNN_ia64_choose_gp): Likewise.
|
||||
(elfNN_ia64_relocate_section): Likewise.
|
||||
(elfNN_ia64_finish_dynamic_symbol): Likewise.
|
||||
(elfNN_ia64_finish_dynamic_sections): Likewise.
|
||||
|
||||
2009-06-16 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* elf32-spu.c (needs_ovl_stub): Respect .brinfo lrlive bits
|
||||
|
@ -163,11 +163,8 @@ struct elfNN_ia64_link_hash_table
|
||||
/* The main hash table. */
|
||||
struct elf_link_hash_table root;
|
||||
|
||||
asection *got_sec; /* the linkage table section (or NULL) */
|
||||
asection *rel_got_sec; /* dynamic relocation section for same */
|
||||
asection *fptr_sec; /* function descriptor table (or NULL) */
|
||||
asection *rel_fptr_sec; /* dynamic relocation section for same */
|
||||
asection *plt_sec; /* the primary plt section (or NULL) */
|
||||
asection *pltoff_sec; /* private descriptors for plt (or NULL) */
|
||||
asection *rel_pltoff_sec; /* dynamic relocation section for same */
|
||||
|
||||
@ -932,7 +929,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
|
||||
if (r_type != R_IA64_PCREL21B)
|
||||
continue;
|
||||
|
||||
tsec = ia64_info->plt_sec;
|
||||
tsec = ia64_info->root.splt;
|
||||
toff = dyn_i->plt2_offset;
|
||||
BFD_ASSERT (irel->r_addend == 0);
|
||||
}
|
||||
@ -1005,7 +1002,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
|
||||
to 32byte. We assume linker will always insert 32byte
|
||||
between the .plt and .text sections after the the first
|
||||
relaxation pass. */
|
||||
if (tsec == ia64_info->plt_sec)
|
||||
if (tsec == ia64_info->root.splt)
|
||||
offset = -0x1000000 + 32;
|
||||
else
|
||||
offset = -0x1000000;
|
||||
@ -1076,7 +1073,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
|
||||
|
||||
size_t size;
|
||||
|
||||
if (tsec == ia64_info->plt_sec)
|
||||
if (tsec == ia64_info->root.splt)
|
||||
size = sizeof (plt_full_entry);
|
||||
else
|
||||
size = oor_branch_size;
|
||||
@ -1096,7 +1093,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
|
||||
goto error_return;
|
||||
sec->size = amt;
|
||||
|
||||
if (tsec == ia64_info->plt_sec)
|
||||
if (tsec == ia64_info->root.splt)
|
||||
{
|
||||
memcpy (contents + trampoff, plt_full_entry, size);
|
||||
|
||||
@ -1250,16 +1247,16 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
|
||||
ia64_info->got_sec->size = data.ofs;
|
||||
ia64_info->root.sgot->size = data.ofs;
|
||||
|
||||
if (ia64_info->root.dynamic_sections_created
|
||||
&& ia64_info->rel_got_sec != NULL)
|
||||
&& ia64_info->root.srelgot != NULL)
|
||||
{
|
||||
/* Resize .rela.got. */
|
||||
ia64_info->rel_got_sec->size = 0;
|
||||
ia64_info->root.srelgot->size = 0;
|
||||
if (link_info->shared
|
||||
&& ia64_info->self_dtpmod_offset != (bfd_vma) -1)
|
||||
ia64_info->rel_got_sec->size += sizeof (ElfNN_External_Rela);
|
||||
ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||
data.only_got = TRUE;
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries,
|
||||
&data);
|
||||
@ -2003,14 +2000,12 @@ elfNN_ia64_create_dynamic_sections (bfd *abfd,
|
||||
|
||||
ia64_info = elfNN_ia64_hash_table (info);
|
||||
|
||||
ia64_info->plt_sec = bfd_get_section_by_name (abfd, ".plt");
|
||||
ia64_info->got_sec = bfd_get_section_by_name (abfd, ".got");
|
||||
|
||||
{
|
||||
flagword flags = bfd_get_section_flags (abfd, ia64_info->got_sec);
|
||||
bfd_set_section_flags (abfd, ia64_info->got_sec, SEC_SMALL_DATA | flags);
|
||||
flagword flags = bfd_get_section_flags (abfd, ia64_info->root.sgot);
|
||||
bfd_set_section_flags (abfd, ia64_info->root.sgot,
|
||||
SEC_SMALL_DATA | flags);
|
||||
/* The .got section is always aligned at 8 bytes. */
|
||||
bfd_set_section_alignment (abfd, ia64_info->got_sec, 3);
|
||||
bfd_set_section_alignment (abfd, ia64_info->root.sgot, 3);
|
||||
}
|
||||
|
||||
if (!get_pltoff (abfd, info, ia64_info))
|
||||
@ -2027,17 +2022,6 @@ elfNN_ia64_create_dynamic_sections (bfd *abfd,
|
||||
return FALSE;
|
||||
ia64_info->rel_pltoff_sec = s;
|
||||
|
||||
s = bfd_make_section_with_flags (abfd, ".rela.got",
|
||||
(SEC_ALLOC | SEC_LOAD
|
||||
| SEC_HAS_CONTENTS
|
||||
| SEC_IN_MEMORY
|
||||
| SEC_LINKER_CREATED
|
||||
| SEC_READONLY));
|
||||
if (s == NULL
|
||||
|| !bfd_set_section_alignment (abfd, s, LOG_SECTION_ALIGN))
|
||||
return FALSE;
|
||||
ia64_info->rel_got_sec = s;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2418,7 +2402,7 @@ get_got (bfd *abfd, struct bfd_link_info *info,
|
||||
asection *got;
|
||||
bfd *dynobj;
|
||||
|
||||
got = ia64_info->got_sec;
|
||||
got = ia64_info->root.sgot;
|
||||
if (!got)
|
||||
{
|
||||
flagword flags;
|
||||
@ -2429,9 +2413,7 @@ get_got (bfd *abfd, struct bfd_link_info *info,
|
||||
if (!_bfd_elf_create_got_section (dynobj, info))
|
||||
return 0;
|
||||
|
||||
got = bfd_get_section_by_name (dynobj, ".got");
|
||||
BFD_ASSERT (got);
|
||||
ia64_info->got_sec = got;
|
||||
got = ia64_info->root.sgot;
|
||||
|
||||
/* The .got section is always aligned at 8 bytes. */
|
||||
if (!bfd_set_section_alignment (abfd, got, 3))
|
||||
@ -3330,14 +3312,14 @@ allocate_dynrel_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
|
||||
|| !x->info->pie
|
||||
|| dyn_i->h == NULL
|
||||
|| dyn_i->h->root.type != bfd_link_hash_undefweak)
|
||||
ia64_info->rel_got_sec->size += sizeof (ElfNN_External_Rela);
|
||||
ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||
}
|
||||
if ((dynamic_symbol || shared) && dyn_i->want_tprel)
|
||||
ia64_info->rel_got_sec->size += sizeof (ElfNN_External_Rela);
|
||||
ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||
if (dynamic_symbol && dyn_i->want_dtpmod)
|
||||
ia64_info->rel_got_sec->size += sizeof (ElfNN_External_Rela);
|
||||
ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||
if (dynamic_symbol && dyn_i->want_dtprel)
|
||||
ia64_info->rel_got_sec->size += sizeof (ElfNN_External_Rela);
|
||||
ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||
|
||||
if (x->only_got)
|
||||
return TRUE;
|
||||
@ -3471,13 +3453,13 @@ elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
|
||||
/* Allocate the GOT entries. */
|
||||
|
||||
if (ia64_info->got_sec)
|
||||
if (ia64_info->root.sgot)
|
||||
{
|
||||
data.ofs = 0;
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
|
||||
ia64_info->got_sec->size = data.ofs;
|
||||
ia64_info->root.sgot->size = data.ofs;
|
||||
}
|
||||
|
||||
/* Allocate the FPTR entries. */
|
||||
@ -3516,7 +3498,7 @@ elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
|
||||
BFD_ASSERT (ia64_info->root.dynamic_sections_created);
|
||||
|
||||
ia64_info->plt_sec->size = data.ofs;
|
||||
ia64_info->root.splt->size = data.ofs;
|
||||
|
||||
/* If we've got a .plt, we need some extra memory for the dynamic
|
||||
linker. We stuff these in .got.plt. */
|
||||
@ -3539,7 +3521,7 @@ elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
required. */
|
||||
|
||||
if (info->shared && ia64_info->self_dtpmod_offset != (bfd_vma) -1)
|
||||
ia64_info->rel_got_sec->size += sizeof (ElfNN_External_Rela);
|
||||
ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||
data.only_got = FALSE;
|
||||
elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
|
||||
}
|
||||
@ -3563,12 +3545,12 @@ elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
|
||||
strip = (sec->size == 0);
|
||||
|
||||
if (sec == ia64_info->got_sec)
|
||||
if (sec == ia64_info->root.sgot)
|
||||
strip = FALSE;
|
||||
else if (sec == ia64_info->rel_got_sec)
|
||||
else if (sec == ia64_info->root.srelgot)
|
||||
{
|
||||
if (strip)
|
||||
ia64_info->rel_got_sec = NULL;
|
||||
ia64_info->root.srelgot = NULL;
|
||||
else
|
||||
/* We use the reloc_count field as a counter if we need to
|
||||
copy relocs into the output file. */
|
||||
@ -3588,10 +3570,10 @@ elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
copy relocs into the output file. */
|
||||
sec->reloc_count = 0;
|
||||
}
|
||||
else if (sec == ia64_info->plt_sec)
|
||||
else if (sec == ia64_info->root.splt)
|
||||
{
|
||||
if (strip)
|
||||
ia64_info->plt_sec = NULL;
|
||||
ia64_info->root.splt = NULL;
|
||||
}
|
||||
else if (sec == ia64_info->pltoff_sec)
|
||||
{
|
||||
@ -3960,7 +3942,7 @@ set_got_entry (bfd *abfd, struct bfd_link_info *info,
|
||||
bfd_vma got_offset;
|
||||
|
||||
ia64_info = elfNN_ia64_hash_table (info);
|
||||
got_sec = ia64_info->got_sec;
|
||||
got_sec = ia64_info->root.sgot;
|
||||
|
||||
switch (dyn_r_type)
|
||||
{
|
||||
@ -4071,7 +4053,7 @@ set_got_entry (bfd *abfd, struct bfd_link_info *info,
|
||||
}
|
||||
|
||||
elfNN_ia64_install_dyn_reloc (abfd, NULL, got_sec,
|
||||
ia64_info->rel_got_sec,
|
||||
ia64_info->root.srelgot,
|
||||
got_offset, dyn_r_type,
|
||||
dynindx, addend);
|
||||
}
|
||||
@ -4292,7 +4274,7 @@ elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info)
|
||||
{
|
||||
/* Pick a sensible value. */
|
||||
|
||||
asection *got_sec = ia64_info->got_sec;
|
||||
asection *got_sec = ia64_info->root.sgot;
|
||||
|
||||
/* Start with just the address of the .got. */
|
||||
if (got_sec)
|
||||
@ -4845,8 +4827,8 @@ elfNN_ia64_relocate_section (bfd *output_bfd,
|
||||
/* Should have caught this earlier. */
|
||||
BFD_ASSERT (rel->r_addend == 0);
|
||||
|
||||
value = (ia64_info->plt_sec->output_section->vma
|
||||
+ ia64_info->plt_sec->output_offset
|
||||
value = (ia64_info->root.splt->output_section->vma
|
||||
+ ia64_info->root.splt->output_offset
|
||||
+ dyn_i->plt2_offset);
|
||||
}
|
||||
else
|
||||
@ -5184,7 +5166,7 @@ elfNN_ia64_finish_dynamic_symbol (bfd *output_bfd,
|
||||
/* Initialize the minimal PLT entry. */
|
||||
|
||||
index = (dyn_i->plt_offset - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
|
||||
plt_sec = ia64_info->plt_sec;
|
||||
plt_sec = ia64_info->root.splt;
|
||||
loc = plt_sec->contents + dyn_i->plt_offset;
|
||||
|
||||
memcpy (loc, plt_min_entry, PLT_MIN_ENTRY_SIZE);
|
||||
@ -5313,9 +5295,9 @@ elfNN_ia64_finish_dynamic_sections (bfd *abfd,
|
||||
}
|
||||
|
||||
/* Initialize the PLT0 entry. */
|
||||
if (ia64_info->plt_sec)
|
||||
if (ia64_info->root.splt)
|
||||
{
|
||||
bfd_byte *loc = ia64_info->plt_sec->contents;
|
||||
bfd_byte *loc = ia64_info->root.splt->contents;
|
||||
bfd_vma pltres;
|
||||
|
||||
memcpy (loc, plt_header, PLT_HEADER_SIZE);
|
||||
|
Loading…
x
Reference in New Issue
Block a user