aboutsummaryrefslogtreecommitdiff
path: root/elfcpp
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-06-18 15:33:38 +0930
committerAlan Modra <amodra@gmail.com>2019-07-13 09:57:50 +0930
commit32f598441988e5a086ba8580e82f4944c3692eb5 (patch)
tree02470bbe7c1b886192709f199dfad34e6f9df411 /elfcpp
parentAutomatic date update in version.in (diff)
downloadbinutils-gdb-32f598441988e5a086ba8580e82f4944c3692eb5.tar.gz
binutils-gdb-32f598441988e5a086ba8580e82f4944c3692eb5.tar.bz2
binutils-gdb-32f598441988e5a086ba8580e82f4944c3692eb5.zip
[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/ChangeLog4
-rw-r--r--elfcpp/powerpc.h2
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,