aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2015-05-14 05:22:55 +0300
committerMax Filippov <jcmvbkbc@gmail.com>2015-05-14 07:07:27 +0300
commite6c9a083ec5ae7a45bd71682b26aae1939849388 (patch)
tree1d0428700440811fe3779ed211f669c022a21955 /bfd
parentd121800b7f1df96db2dc6ab1d1a86c51befde063 (diff)
downloadfsf-binutils-gdb-e6c9a083ec5ae7a45bd71682b26aae1939849388.zip
fsf-binutils-gdb-e6c9a083ec5ae7a45bd71682b26aae1939849388.tar.gz
fsf-binutils-gdb-e6c9a083ec5ae7a45bd71682b26aae1939849388.tar.bz2
xtensa: fix localized symbol refcounting with --gc-sections
elf_xtensa_gc_sweep_hook doesn't correctly unreference symbols that were made local, that results in link failure with the following message: BFD (GNU Binutils) 2.24 internal error, aborting at elf32-xtensa.c line 3372 in elf_xtensa_finish_dynamic_sections elf_xtensa_gc_sweep_hook determines symbol reference type (PLT or GOT) by relocation type. Relocation types are not changed when symbol becomes local, but its PLT references are added to GOT references and plt.refcount is set to 0. Such symbol cannot be unreferences in the elf_xtensa_gc_sweep_hook and its extra references make calculated GOT relocations section size not match number of GOT relocations. Fix it by treating PLT reference as GOT reference when plt.refcount is not positive. 2015-05-14 Max Filippov <jcmvbkbc@gmail.com> bfd/ * elf32-xtensa.c (elf_xtensa_gc_sweep_hook): Treat PLT reference as GOT reference when plt.refcount is not positive.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-xtensa.c6
2 files changed, 10 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 398476b..24f08d9 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-14 Max Filippov <jcmvbkbc@gmail.com>
+
+ * elf32-xtensa.c (elf_xtensa_gc_sweep_hook): Treat PLT reference
+ as GOT reference when plt.refcount is not positive.
+
2015-05-12 H.J. Lu <hongjiu.lu@intel.com>
* elf32-i386.c (elf_i386_allocate_dynrelocs): Allocate space
diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
index 53af1c6..2523670 100644
--- a/bfd/elf32-xtensa.c
+++ b/bfd/elf32-xtensa.c
@@ -1360,10 +1360,14 @@ elf_xtensa_gc_sweep_hook (bfd *abfd,
{
if (is_plt)
{
+ /* If the symbol has been localized its plt.refcount got moved
+ to got.refcount. Handle it as GOT. */
if (h->plt.refcount > 0)
h->plt.refcount--;
+ else
+ is_got = TRUE;
}
- else if (is_got)
+ if (is_got)
{
if (h->got.refcount > 0)
h->got.refcount--;