2016-01-03 11:05:27 +00:00
|
|
|
From 8ec76b16f62d1bf386fb2c39af5f66c3afddc5cb Mon Sep 17 00:00:00 2001
|
|
|
|
From: Max Filippov <jcmvbkbc@gmail.com>
|
|
|
|
Date: Thu, 14 May 2015 05:22:55 +0300
|
|
|
|
Subject: [PATCH] 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.
|
|
|
|
|
|
|
|
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
|
|
|
|
---
|
|
|
|
Backported from: e6c9a083ec5ae7a45bd71682b26aae1939849388
|
|
|
|
Changes to ChangeLog are dropped.
|
|
|
|
|
2017-12-02 20:44:39 +00:00
|
|
|
bfd/elf32-xtensa.c | 6 +++++-
|
2016-01-03 11:05:27 +00:00
|
|
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
--- a/bfd/elf32-xtensa.c
|
|
|
|
+++ b/bfd/elf32-xtensa.c
|
2017-12-02 20:44:39 +00:00
|
|
|
@@ -1362,10 +1362,14 @@
|
2016-01-03 11:05:27 +00:00
|
|
|
{
|
|
|
|
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--;
|