This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] 2017-06-20 Eric Christopher <echristo at gmail dot com>


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=69431babfb54b26000fdcc016323cf811d48e862

commit 69431babfb54b26000fdcc016323cf811d48e862
Author: Eric Christopher <echristo@gmail.com>
Date:   Tue Jun 20 16:18:58 2017 -0700

    2017-06-20  Eric Christopher  <echristo@gmail.com>
    
            * aarch64.cc (scan_reloc_for_stub): Use plt_address_for_global to
            calculate the symbol value.
            (scan_reloc_section_for_stubs): Allow stubs to be created for
            section symbols.
            (maybe_apply_stub): Handle creating stubs for weak symbols to
            match the code in scan_reloc_for_stub.

Diff:
---
 gold/ChangeLog  |  9 +++++++++
 gold/aarch64.cc | 21 +++++++++------------
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 2fd3038..d6bcff8 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2017-06-20  Eric Christopher  <echristo@gmail.com>
+
+	* aarch64.cc (scan_reloc_for_stub): Use plt_address_for_global to
+	calculate the symbol value.
+	(scan_reloc_section_for_stubs): Allow stubs to be created for
+	section symbols.
+	(maybe_apply_stub): Handle creating stubs for weak symbols to
+	match the code in scan_reloc_for_stub.
+
 2017-06-20  James Clarke  <jrtc27@jrtc27.com>
 
 	* powerpc.cc (Stub_table::define_stub_syms): Always include object's
diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index 33f7abe..11bb48e 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -3768,8 +3768,7 @@ Target_aarch64<size, big_endian>::scan_reloc_for_stub(
       if (gsym->use_plt_offset(arp->reference_flags()))
 	{
 	  // This uses a PLT, change the symbol value.
-	  symval.set_output_value(this->plt_section()->address()
-				  + gsym->plt_offset());
+	  symval.set_output_value(this->plt_address_for_global(gsym));
 	  psymval = &symval;
 	}
       else if (gsym->is_undefined())
@@ -4002,11 +4001,6 @@ Target_aarch64<size, big_endian>::scan_reloc_section_for_stubs(
 	  psymval = &symval2;
 	}
 
-      // If symbol is a section symbol, we don't know the actual type of
-      // destination.  Give up.
-      if (psymval->is_section_symbol())
-	continue;
-
       this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
 				addend, view_address + offset);
     }  // End of iterating relocs in a section
@@ -5438,8 +5432,14 @@ maybe_apply_stub(unsigned int r_type,
 
   const The_aarch64_relobj* aarch64_relobj =
       static_cast<const The_aarch64_relobj*>(object);
-  // We don't create stubs for undefined symbols so don't look for one.
-  if (gsym && gsym->is_undefined())
+  const AArch64_reloc_property* arp =
+    aarch64_reloc_property_table->get_reloc_property(r_type);
+  gold_assert(arp != NULL);
+
+  // We don't create stubs for undefined symbols, but do for weak.
+  if (gsym
+      && !gsym->use_plt_offset(arp->reference_flags())
+      && gsym->is_undefined())
     {
       gold_debug(DEBUG_TARGET,
 		 "stub: looking for a stub for undefined symbol %s in file %s",
@@ -5458,9 +5458,6 @@ maybe_apply_stub(unsigned int r_type,
   Address new_branch_target = stub_table->address() + stub->offset();
   typename elfcpp::Swap<size, big_endian>::Valtype branch_offset =
       new_branch_target - address;
-  const AArch64_reloc_property* arp =
-      aarch64_reloc_property_table->get_reloc_property(r_type);
-  gold_assert(arp != NULL);
   typename This::Status status = This::template
       rela_general<32>(view, branch_offset, 0, arp);
   if (status != This::STATUS_OKAY)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]