This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb/binutils-2_28-branch] [GOLD] Avoid duplicate PLT stub symbols on ppc32
- From: Alan Modra <amodra at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 20 Jun 2017 09:13:30 -0000
- Subject: [binutils-gdb/binutils-2_28-branch] [GOLD] Avoid duplicate PLT stub symbols on ppc32
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a3e00a8704fee31d815aeb5983a881eed490969e
commit a3e00a8704fee31d815aeb5983a881eed490969e
Author: James Clarke <jrtc27@jrtc27.com>
Date: Tue Jun 20 18:01:52 2017 +0930
[GOLD] Avoid duplicate PLT stub symbols on ppc32
If two objects are compiled with -fPIC or -fPIE and call the same
function, two different PLT entries are created, one for each object,
but the same stub symbol name is used for both.
* powerpc.cc (Stub_table::define_stub_syms): Always include object's
uniq_ value.
Diff:
---
gold/ChangeLog | 5 +++++
gold/powerpc.cc | 18 ++++++++++++------
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/gold/ChangeLog b/gold/ChangeLog
index f6a0836..98adcbb 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-20 James Clarke <jrtc27@jrtc27.com>
+
+ * powerpc.cc (Stub_table::define_stub_syms): Always include object's
+ uniq_ value.
+
2017-06-03 Alan Modra <amodra@gmail.com>
Apply from master
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index 1f2bc9e..a448efb 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -4656,19 +4656,25 @@ Stub_table<size, big_endian>::define_stub_syms(Symbol_table* symtab)
add[0] = 0;
if (cs->first.addend_ != 0)
sprintf(add, "+%x", static_cast<uint32_t>(cs->first.addend_));
- char localname[18];
- const char *symname;
- if (cs->first.sym_ == NULL)
+ char obj[10];
+ obj[0] = 0;
+ if (cs->first.object_)
{
const Powerpc_relobj<size, big_endian>* ppcobj = static_cast
<const Powerpc_relobj<size, big_endian>*>(cs->first.object_);
- sprintf(localname, "%x:%x", ppcobj->uniq(), cs->first.locsym_);
+ sprintf(obj, "%x:", ppcobj->uniq());
+ }
+ char localname[9];
+ const char *symname;
+ if (cs->first.sym_ == NULL)
+ {
+ sprintf(localname, "%x", cs->first.locsym_);
symname = localname;
}
else
symname = cs->first.sym_->name();
- char* name = new char[8 + 10 + strlen(symname) + strlen(add) + 1];
- sprintf(name, "%08x.plt_call.%s%s", this->uniq_, symname, add);
+ char* name = new char[8 + 10 + strlen(obj) + strlen(symname) + strlen(add) + 1];
+ sprintf(name, "%08x.plt_call.%s%s%s", this->uniq_, obj, symname, add);
Address value = this->stub_address() - this->address() + cs->second;
unsigned int stub_size = this->plt_call_size(cs);
this->targ_->define_local(symtab, name, this, value, stub_size);