diff options
author | James Clarke <jrtc27@jrtc27.com> | 2017-06-20 18:01:52 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-06-20 18:01:52 +0930 |
commit | 94de2a2c57b7f6b2870f72ecdcacc6d909c6421a (patch) | |
tree | 19d301f1ac6ec42be6944997ab9180c59bd4459e /gold | |
parent | abfa390dac6ffcfc6de9659c0b78cfe524347450 (diff) | |
download | gdb-94de2a2c57b7f6b2870f72ecdcacc6d909c6421a.zip gdb-94de2a2c57b7f6b2870f72ecdcacc6d909c6421a.tar.gz gdb-94de2a2c57b7f6b2870f72ecdcacc6d909c6421a.tar.bz2 |
[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.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 5 | ||||
-rw-r--r-- | gold/powerpc.cc | 18 |
2 files changed, 17 insertions, 6 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 0b751b5..2fd3038 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-15 Eric Christopher <echristo@gmail.com> * aarch64.cc: Fix a few typos and grammar-os. 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); |