* 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 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.
/* 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. */
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. */
}
}
}
- 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)
{
&& 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
&& 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;
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. */
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)
{
&& 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
&& 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;
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));
+}