[PATCH] gold: Handle local IFUNC symbol for APLT

H.J. Lu hjl.tools@gmail.com
Sat Apr 25 15:24:52 GMT 2020


Handle local IFUNC symbol for APLT like global IFUNC symbol.

	PR gold/25872
	* x86_64.cc (Output_data_plt_x86_64_bnd::do_address_for_local):
	Handle local IFUNC symbol.
	(Output_data_plt_x86_64_ibt::do_address_for_local): Likewise.
---
 gold/x86_64.cc | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 1442a009d7..b094e4bd3b 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -2114,7 +2114,12 @@ Output_data_plt_x86_64_bnd::do_address_for_local(const Relobj* object,
 						 unsigned int r_sym)
 {
   // Convert the PLT offset into an APLT offset.
-  unsigned int plt_offset = ((object->local_plt_offset(r_sym) - plt_entry_size)
+  const Sized_relobj_file<64, false>* sized_relobj =
+    static_cast<const Sized_relobj_file<64, false>*>(object);
+  const Symbol_value<64>* psymval = sized_relobj->local_symbol(r_sym);
+  unsigned int plt_offset = ((object->local_plt_offset(r_sym)
+			      - (psymval->is_ifunc_symbol()
+				 ? 0 : plt_entry_size))
 			     / (plt_entry_size / aplt_entry_size));
   return (this->address()
 	  + this->aplt_offset_
@@ -2288,7 +2293,12 @@ Output_data_plt_x86_64_ibt<size>::do_address_for_local(const Relobj* object,
 						 unsigned int r_sym)
 {
   // Convert the PLT offset into an APLT offset.
-  unsigned int plt_offset = ((object->local_plt_offset(r_sym) - plt_entry_size)
+  const Sized_relobj_file<size, false>* sized_relobj =
+    static_cast<const Sized_relobj_file<size, false>*>(object);
+  const Symbol_value<size>* psymval = sized_relobj->local_symbol(r_sym);
+  unsigned int plt_offset = ((object->local_plt_offset(r_sym)
+			      - (psymval->is_ifunc_symbol()
+				 ? 0 : plt_entry_size))
 			     / (plt_entry_size / aplt_entry_size));
   return (this->address()
 	  + this->aplt_offset_
-- 
2.25.3



More information about the Binutils mailing list