diff options
author | Alan Modra <amodra@gmail.com> | 2021-08-25 21:58:51 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-09-18 08:20:11 +0930 |
commit | e4d49a0f908415edb7a7e718ef2008a96dd43f9b (patch) | |
tree | b23f491455f9e03d32f806cd26590414f4259b73 /gold/target.h | |
parent | 2cc9ed14fae1b288bbdbd9b102b2cbc9a29bf348 (diff) | |
download | binutils-e4d49a0f908415edb7a7e718ef2008a96dd43f9b.zip binutils-e4d49a0f908415edb7a7e718ef2008a96dd43f9b.tar.gz binutils-e4d49a0f908415edb7a7e718ef2008a96dd43f9b.tar.bz2 |
[GOLD] Got_entry::write addends
This takes care of writing out GOT entries with addends. The local
symbol case was already largely handled, except for passing the addend
to tls_offset_for_local which might need the addend in a
local_got_offset call. That's needed also in tls_offset_for_global.
I'm assuming here that GOT entries for function symbols won't ever
have addends, and in particular that a GOT entry referencing PLT call
stub code won't want an offset into the code.
PR 28192
* output.cc (Output_data_got::Got_entry::write): Include addend
in global symbol value. Pass addend to tls_offset_for_*.
* powerpc.cc (Target_powerpc::do_tls_offset_for_local): Handle addend.
(Target_powerpc::do_tls_offset_for_global): Likewise.
* s390.cc (Target_s390::do_tls_offset_for_local): Likewise.
(Target_s390::do_tls_offset_for_global): Likewise.
* target.h (Target::tls_offset_for_local): Add addend param.
(Target::tls_offset_for_global): Likewise.
(Target::do_tls_offset_for_local): Likewise.
(Target::do_tls_offset_for_global): Likewise.
Diffstat (limited to 'gold/target.h')
-rw-r--r-- | gold/target.h | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/gold/target.h b/gold/target.h index 24f7111..4fce9fd 100644 --- a/gold/target.h +++ b/gold/target.h @@ -289,14 +289,16 @@ class Target int64_t tls_offset_for_local(const Relobj* object, unsigned int symndx, - unsigned int got_indx) const - { return do_tls_offset_for_local(object, symndx, got_indx); } + unsigned int got_indx, + uint64_t addend) const + { return do_tls_offset_for_local(object, symndx, got_indx, addend); } // Return the offset to use for the GOT_INDX'th got entry which is // for global tls symbol GSYM. int64_t - tls_offset_for_global(Symbol* gsym, unsigned int got_indx) const - { return do_tls_offset_for_global(gsym, got_indx); } + tls_offset_for_global(Symbol* gsym, unsigned int got_indx, + uint64_t addend) const + { return do_tls_offset_for_global(gsym, got_indx, addend); } // For targets that use function descriptors, if LOC is the location // of a function, modify it to point at the function entry location. @@ -648,11 +650,12 @@ class Target { gold_unreachable(); } virtual int64_t - do_tls_offset_for_local(const Relobj*, unsigned int, unsigned int) const + do_tls_offset_for_local(const Relobj*, unsigned int, unsigned int, + uint64_t) const { gold_unreachable(); } virtual int64_t - do_tls_offset_for_global(Symbol*, unsigned int) const + do_tls_offset_for_global(Symbol*, unsigned int, uint64_t) const { gold_unreachable(); } virtual void |