summaryrefslogtreecommitdiff
path: root/bfd/elf32-i386.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-12-16 23:01:07 +0000
committerH.J. Lu <hjl.tools@gmail.com>2012-12-16 23:01:07 +0000
commit096928d1633f9604751d0b6ae0cfc9d3474cbe41 (patch)
treec9aec18a4b112b15417fa043029df13d683e01d4 /bfd/elf32-i386.c
parent98d1f7c2d02db4c2ccaf43a58a8443d35ab027df (diff)
downloadbinutils-redhat-096928d1633f9604751d0b6ae0cfc9d3474cbe41.tar.gz
Don't check IFUNC relocations in elf_*_check_relocs
* elf32-i386.c (elf_i386_check_relocs): Don't check IFUNC relocations here. * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r--bfd/elf32-i386.c69
1 files changed, 2 insertions, 67 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index a188cec2b8..71e9eaf7ea 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -1517,73 +1517,8 @@ elf_i386_check_relocs (bfd *abfd,
break;
}
- /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
- it here if it is defined in a non-shared object. */
- if (h->type == STT_GNU_IFUNC
- && h->def_regular)
- {
- /* It is referenced by a non-shared object. */
- h->ref_regular = 1;
- h->needs_plt = 1;
-
- /* STT_GNU_IFUNC symbol must go through PLT. */
- h->plt.refcount += 1;
-
- /* STT_GNU_IFUNC needs dynamic sections. */
- if (htab->elf.dynobj == NULL)
- htab->elf.dynobj = abfd;
-
- switch (r_type)
- {
- default:
- if (h->root.root.string)
- name = h->root.root.string;
- else
- name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
- NULL);
- (*_bfd_error_handler)
- (_("%B: relocation %s against STT_GNU_IFUNC "
- "symbol `%s' isn't handled by %s"), abfd,
- elf_howto_table[r_type].name,
- name, __FUNCTION__);
- bfd_set_error (bfd_error_bad_value);
- return FALSE;
-
- case R_386_32:
- h->non_got_ref = 1;
- h->pointer_equality_needed = 1;
- if (info->shared)
- {
- /* We must copy these reloc types into the
- output file. Create a reloc section in
- dynobj and make room for this reloc. */
- sreloc = _bfd_elf_create_ifunc_dyn_reloc
- (abfd, info, sec, sreloc,
- &((struct elf_i386_link_hash_entry *) h)->dyn_relocs);
- if (sreloc == NULL)
- return FALSE;
- }
- break;
-
- case R_386_PC32:
- h->non_got_ref = 1;
- break;
-
- case R_386_PLT32:
- break;
-
- case R_386_GOT32:
- case R_386_GOTOFF:
- h->got.refcount += 1;
- if (htab->elf.sgot == NULL
- && !_bfd_elf_create_got_section (htab->elf.dynobj,
- info))
- return FALSE;
- break;
- }
-
- continue;
- }
+ /* It is referenced by a non-shared object. */
+ h->ref_regular = 1;
}
if (! elf_i386_tls_transition (info, abfd, sec, NULL,