diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2011-04-21 22:25:39 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2011-04-21 22:25:39 +0000 |
commit | aa71524235bce7aa6f0b9ae12aa679ed8c3fd96f (patch) | |
tree | 68c9cae6fe2b22d0d42566b803dd8b3b5540d302 /bfd | |
parent | f6df62c820e674bda7550f998e83f8b95f22d0fb (diff) | |
download | binutils-gdb-aa71524235bce7aa6f0b9ae12aa679ed8c3fd96f.tar.gz |
Skip local IFUNC symbols when checking dynamic relocs in read-only sections.
bfd/
2011-04-21 H.J. Lu <hongjiu.lu@intel.com>
PR ld/12694
* elf32-i386.c (elf_i386_readonly_dynrelocs): Skip local IFUNC
symbols.
* elf64-x86-64.c (elf_x86_64_readonly_dynrelocs): Likewise.
ld/testsuite/
2011-04-21 H.J. Lu <hongjiu.lu@intel.com>
PR ld/12694
* ld-ifunc/ifunc-14-i386.d: New.
* ld-ifunc/ifunc-14-x86-64.d: Likewise.
* ld-ifunc/ifunc-14a.s: Likewise.
* ld-ifunc/ifunc-14b.s: Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 4 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 4 |
3 files changed, 15 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 225a3fb40ab..4d984568088 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,12 @@ 2011-04-21 H.J. Lu <hongjiu.lu@intel.com> + PR ld/12694 + * elf32-i386.c (elf_i386_readonly_dynrelocs): Skip local IFUNC + symbols. + * elf64-x86-64.c (elf_x86_64_readonly_dynrelocs): Likewise. + +2011-04-21 H.J. Lu <hongjiu.lu@intel.com> + * elf32-i386.c (elf_i386_finish_dynamic_symbol): Return false on dynamic symbol error. * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Likewise. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 1bdc05e9ae2..bb79f897d79 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2384,6 +2384,10 @@ elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf) if (h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + /* Skip local IFUNC symbols. */ + if (h->forced_local && h->type == STT_GNU_IFUNC) + return TRUE; + eh = (struct elf_i386_link_hash_entry *) h; for (p = eh->dyn_relocs; p != NULL; p = p->next) { diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 6190a988477..8d00eddb3da 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2299,6 +2299,10 @@ elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h, if (h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + /* Skip local IFUNC symbols. */ + if (h->forced_local && h->type == STT_GNU_IFUNC) + return TRUE; + eh = (struct elf_x86_64_link_hash_entry *) h; for (p = eh->dyn_relocs; p != NULL; p = p->next) { |