diff options
author | Alan Modra <amodra@gmail.com> | 2019-06-18 15:33:38 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-07-13 09:57:50 +0930 |
commit | 32f598441988e5a086ba8580e82f4944c3692eb5 (patch) | |
tree | 02470bbe7c1b886192709f199dfad34e6f9df411 /elfcpp | |
parent | 154a0a90ddde3a5d538830527ffd6d128cb23b1b (diff) | |
download | binutils-gdb-32f598441988e5a086ba8580e82f4944c3692eb5.tar.gz |
[GOLD] PowerPC64 ELFv2 notoc support
Calls from notoc functions via the PLT need different stubs. Even
calls to local functions requiring a valid toc pointer must go via a
stub. This patch provides the support in gold.
elfcpp/
* powerpc.h (R_PPC64_PLTSEQ_NOTOC, R_PPC64_PLTCALL_NOTOC): Define.
gold/
* powerpc.cc (Target_powerpc::maybe_skip_tls_get_addr_call): Handle
notoc calls.
(is_branch_reloc): Template on size. Return true for REL24_NOTOC.
Update all callers.
(max_branch_delta): Likewise.
(Target_powerpc::Branch_info::make_stub): Add a stub for notoc
calls to functions needing a valid toc pointer.
(Target_powerpc::do_relax): Layout stubs again if any need resize.
(add_12_11_12, addi_12_11, addis_12_11, ldx_12_11_12, ori_12_12_0),
(oris_12_12_0, sldi_12_12_32): Define.
(Stub_table::Plt_stub_ent): Add notoc_ and iter_ fields.
(Stub_table::Branch_stub_key, Branch_stub_key_hash): Rename from
Branch_stub_ent and Branch_stub_ent hash. Remove save_res_ from key.
(Stub_table::Branch_stub_ent): New struct.
(class Stub_table): Add need_resize and resizing vars.
(Stub_table::need_resize, branch_size): New accessors.
(Stub_table::set_resizing): New function.
(Stub_table::add_plt_call_entry): Handle notoc calls and resizing
on seeing such or a tocsave stubs after a normal stub using the
same sym.
(Stub_table::add_long_branch_entry): Similarly.
(Stub_table::find_long_branch_entry): Return a Branch_stub_ent*.
(Stub_table::define_stub_syms): Adjust
(Stub_table::build_tls_opt_head, build_tls_opt_tail): New functions.
(build_notoc_offset): New function.
(Stub_table::plt_call_size): Move out of line. Handle notoc calls.
(Stub_table::branch_stub_size): Similarly.
(Stub_table::do_write): Separate loop for ELFv2 stubs, handling
notoc calls. Simplify ELFv1 loop. Output notoc branch stubs.
Use build_tls_opt_head and build_tls_opt_tail.
(Target_powerpc::Scan::get_reference_flags): Handle REL24_NOTOC.
(Target_powerpc::Scan::reloc_needs_plt_for_ifunc): Likewise,
and PLTSEQ_NOTOC and PLTCALL_NOTOC.
(Target_powerpc::Scan::local, global, relocate): Likewise.
Diffstat (limited to 'elfcpp')
-rw-r--r-- | elfcpp/ChangeLog | 4 | ||||
-rw-r--r-- | elfcpp/powerpc.h | 2 |
2 files changed, 6 insertions, 0 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog index 0565d7889b9..b2409388338 100644 --- a/elfcpp/ChangeLog +++ b/elfcpp/ChangeLog @@ -1,3 +1,7 @@ +2019-07-13 Alan Modra <amodra@gmail.com> + + * powerpc.h (R_PPC64_PLTSEQ_NOTOC, R_PPC64_PLTCALL_NOTOC): Define. + 2019-06-28 Alan Modra <amodra@gmail.com> * powerpc.h (R_PPC64_REL16_HIGH, R_PPC64_REL16_HIGHA), diff --git a/elfcpp/powerpc.h b/elfcpp/powerpc.h index 4008f55966f..5e5e39abd81 100644 --- a/elfcpp/powerpc.h +++ b/elfcpp/powerpc.h @@ -181,6 +181,8 @@ enum R_PPC64_ENTRY = 118, R_POWERPC_PLTSEQ = 119, R_POWERPC_PLTCALL = 120, + R_PPC64_PLTSEQ_NOTOC = 121, + R_PPC64_PLTCALL_NOTOC = 122, R_PPC_VLE_REL8 = 216, R_PPC_VLE_REL15 = 217, |