2009-05-26 H.J. Lu <hongjiu.lu@intel.com>
* elf-bfd.h (_bfd_elf_is_ifunc_symbol): New. * elf32-i386.c (is_indirect_symbol): Renamed to ... * elflink.c (_bfd_elf_is_ifunc_symbol): This. * elf32-i386.c (allocate_dynrelocs): Updated. (elf_i386_relocate_section): Likewise. * elf64-x86-64.c (allocate_dynrelocs): Likewise. (elf64_x86_64_relocate_section): Likewise. * elf64-x86-64.c (is_indirect_symbol): Removed.
This commit is contained in:
parent
f504f079c0
commit
68d7e96a43
5 changed files with 42 additions and 44 deletions
|
@ -1,3 +1,17 @@
|
|||
2009-05-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elf-bfd.h (_bfd_elf_is_ifunc_symbol): New.
|
||||
|
||||
* elf32-i386.c (is_indirect_symbol): Renamed to ...
|
||||
* elflink.c (_bfd_elf_is_ifunc_symbol): This.
|
||||
|
||||
* elf32-i386.c (allocate_dynrelocs): Updated.
|
||||
(elf_i386_relocate_section): Likewise.
|
||||
* elf64-x86-64.c (allocate_dynrelocs): Likewise.
|
||||
(elf64_x86_64_relocate_section): Likewise.
|
||||
|
||||
* elf64-x86-64.c (is_indirect_symbol): Removed.
|
||||
|
||||
2009-05-26 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* po/id.po: Updated Indonesian translation.
|
||||
|
|
|
@ -2155,6 +2155,9 @@ extern asection * _bfd_elf_make_ifunc_reloc_section
|
|||
/* Large common section. */
|
||||
extern asection _bfd_elf_large_com_section;
|
||||
|
||||
extern bfd_boolean _bfd_elf_is_ifunc_symbol
|
||||
(bfd *, struct elf_link_hash_entry *);
|
||||
|
||||
/* This is the condition under which finish_dynamic_symbol will be called.
|
||||
If our finish_dynamic_symbol isn't called, we'll need to do something
|
||||
about initializing any .plt and .got entries in relocate_section. */
|
||||
|
|
|
@ -1196,25 +1196,6 @@ elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Returns true if the hash entry refers to a symbol
|
||||
marked for indirect handling during reloc processing. */
|
||||
|
||||
static bfd_boolean
|
||||
is_indirect_symbol (bfd * abfd, struct elf_link_hash_entry * h)
|
||||
{
|
||||
const struct elf_backend_data * bed;
|
||||
|
||||
if (abfd == NULL || h == NULL)
|
||||
return FALSE;
|
||||
|
||||
bed = get_elf_backend_data (abfd);
|
||||
|
||||
return h->type == STT_GNU_IFUNC
|
||||
&& (bed->elf_osabi == ELFOSABI_LINUX
|
||||
/* GNU/Linux is still using the default value 0. */
|
||||
|| bed->elf_osabi == ELFOSABI_NONE);
|
||||
}
|
||||
|
||||
/* Look through the relocs for a section during the first phase, and
|
||||
calculate needed space in the global offset table, procedure linkage
|
||||
table, and dynamic reloc sections. */
|
||||
|
@ -2062,7 +2043,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (is_indirect_symbol (info->output_bfd, h)
|
||||
else if (_bfd_elf_is_ifunc_symbol (info->output_bfd, h)
|
||||
&& h->dynindx == -1
|
||||
&& ! h->forced_local)
|
||||
{
|
||||
|
@ -2921,7 +2902,7 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||
&& h->dynindx != -1
|
||||
&& ! h->forced_local
|
||||
&& ((struct elf_i386_link_hash_entry *) h)->dyn_relocs != NULL
|
||||
&& is_indirect_symbol (output_bfd, h))
|
||||
&& _bfd_elf_is_ifunc_symbol (output_bfd, h))
|
||||
|| (ELIMINATE_COPY_RELOCS
|
||||
&& !info->shared
|
||||
&& h != NULL
|
||||
|
@ -2974,7 +2955,7 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||
&& h != NULL
|
||||
&& h->dynindx != -1
|
||||
&& ! h->forced_local
|
||||
&& is_indirect_symbol (output_bfd, h)
|
||||
&& _bfd_elf_is_ifunc_symbol (output_bfd, h)
|
||||
&& elf_section_data (input_section)->indirect_relocs != NULL
|
||||
&& elf_section_data (input_section)->indirect_relocs->contents != NULL)
|
||||
sreloc = elf_section_data (input_section)->indirect_relocs;
|
||||
|
|
|
@ -983,25 +983,6 @@ elf64_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Returns true if the hash entry refers to a symbol
|
||||
marked for indirect handling during reloc processing. */
|
||||
|
||||
static bfd_boolean
|
||||
is_indirect_symbol (bfd * abfd, struct elf_link_hash_entry * h)
|
||||
{
|
||||
const struct elf_backend_data * bed;
|
||||
|
||||
if (abfd == NULL || h == NULL)
|
||||
return FALSE;
|
||||
|
||||
bed = get_elf_backend_data (abfd);
|
||||
|
||||
return h->type == STT_GNU_IFUNC
|
||||
&& (bed->elf_osabi == ELFOSABI_LINUX
|
||||
/* GNU/Linux is still using the default value 0. */
|
||||
|| bed->elf_osabi == ELFOSABI_NONE);
|
||||
}
|
||||
|
||||
/* Look through the relocs for a section during the first phase, and
|
||||
calculate needed space in the global offset table, procedure
|
||||
linkage table, and dynamic reloc sections. */
|
||||
|
@ -1860,7 +1841,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
|
|||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (is_indirect_symbol (info->output_bfd, h)
|
||||
else if (_bfd_elf_is_ifunc_symbol (info->output_bfd, h)
|
||||
&& h->dynindx == -1
|
||||
&& ! h->forced_local)
|
||||
{
|
||||
|
@ -2718,7 +2699,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
&& h->dynindx != -1
|
||||
&& ! h->forced_local
|
||||
&& ((struct elf64_x86_64_link_hash_entry *) h)->dyn_relocs != NULL
|
||||
&& is_indirect_symbol (output_bfd, h))
|
||||
&& _bfd_elf_is_ifunc_symbol (output_bfd, h))
|
||||
|| (ELIMINATE_COPY_RELOCS
|
||||
&& !info->shared
|
||||
&& h != NULL
|
||||
|
@ -2814,7 +2795,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
&& h != NULL
|
||||
&& h->dynindx != -1
|
||||
&& ! h->forced_local
|
||||
&& is_indirect_symbol (output_bfd, h)
|
||||
&& _bfd_elf_is_ifunc_symbol (output_bfd, h)
|
||||
&& elf_section_data (input_section)->indirect_relocs != NULL
|
||||
&& elf_section_data (input_section)->indirect_relocs->contents != NULL)
|
||||
sreloc = elf_section_data (input_section)->indirect_relocs;
|
||||
|
|
|
@ -12553,3 +12553,22 @@ _bfd_elf_make_ifunc_reloc_section (bfd * abfd,
|
|||
|
||||
return reloc_sec;
|
||||
}
|
||||
|
||||
/* Returns true if the hash entry refers to a symbol marked for
|
||||
indirect handling during reloc processing. */
|
||||
|
||||
bfd_boolean
|
||||
_bfd_elf_is_ifunc_symbol (bfd *abfd, struct elf_link_hash_entry *h)
|
||||
{
|
||||
const struct elf_backend_data * bed;
|
||||
|
||||
if (abfd == NULL || h == NULL)
|
||||
return FALSE;
|
||||
|
||||
bed = get_elf_backend_data (abfd);
|
||||
|
||||
/* GNU/Linux is still using the default value ELFOSABI_NONE. */
|
||||
return (h->type == STT_GNU_IFUNC
|
||||
&& (bed->elf_osabi == ELFOSABI_LINUX
|
||||
|| bed->elf_osabi == ELFOSABI_NONE));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue