Nick Clifton 6893f2
diff -rup binutils.orig/gold/layout.cc binutils-2.29.1/gold/layout.cc
Nick Clifton 6893f2
--- binutils.orig/gold/layout.cc	2017-10-18 12:00:31.990714767 +0100
Nick Clifton 6893f2
+++ binutils-2.29.1/gold/layout.cc	2017-10-18 12:00:41.351604074 +0100
Nick Clifton 6893f2
@@ -2211,10 +2211,11 @@ Layout::define_section_symbols(Symbol_ta
Nick Clifton 6893f2
 					0, // symsize
Nick Clifton 6893f2
 					elfcpp::STT_NOTYPE,
Nick Clifton 6893f2
 					elfcpp::STB_GLOBAL,
Nick Clifton 6893f2
-					elfcpp::STV_DEFAULT,
Nick Clifton 6893f2
+					elfcpp::STV_PROTECTED,
Nick Clifton 6893f2
 					0, // nonvis
Nick Clifton 6893f2
 					false, // offset_is_from_end
Nick Clifton 6893f2
-					true); // only_if_ref
Nick Clifton 6893f2
+					true, // only_if_ref
Nick Clifton 6893f2
+					true); // must_be_in_reg
Nick Clifton 6893f2
 
Nick Clifton 6893f2
 	  symtab->define_in_output_data(stop_name.c_str(),
Nick Clifton 6893f2
 					NULL, // version
Nick Clifton 6893f2
@@ -2224,10 +2225,11 @@ Layout::define_section_symbols(Symbol_ta
Nick Clifton 6893f2
 					0, // symsize
Nick Clifton 6893f2
 					elfcpp::STT_NOTYPE,
Nick Clifton 6893f2
 					elfcpp::STB_GLOBAL,
Nick Clifton 6893f2
-					elfcpp::STV_DEFAULT,
Nick Clifton 6893f2
+					elfcpp::STV_PROTECTED,
Nick Clifton 6893f2
 					0, // nonvis
Nick Clifton 6893f2
 					true, // offset_is_from_end
Nick Clifton 6893f2
-					true); // only_if_ref
Nick Clifton 6893f2
+					true, // only_if_ref
Nick Clifton 6893f2
+					true); // must_be_in_reg
Nick Clifton 6893f2
 	}
Nick Clifton 6893f2
     }
Nick Clifton 6893f2
 }
Nick Clifton 6893f2
Only in binutils-2.29.1/gold: layout.cc.orig
Nick Clifton 6893f2
diff -rup binutils.orig/gold/symtab.cc binutils-2.29.1/gold/symtab.cc
Nick Clifton 6893f2
--- binutils.orig/gold/symtab.cc	2017-10-18 12:00:31.990714767 +0100
Nick Clifton 6893f2
+++ binutils-2.29.1/gold/symtab.cc	2017-10-18 12:00:41.352604062 +0100
Nick Clifton 6893f2
@@ -1760,7 +1760,9 @@ Sized_symbol<size>*
Nick Clifton 6893f2
 Symbol_table::define_special_symbol(const char** pname, const char** pversion,
Nick Clifton 6893f2
 				    bool only_if_ref,
Nick Clifton 6893f2
                                     Sized_symbol<size>** poldsym,
Nick Clifton 6893f2
-				    bool* resolve_oldsym, bool is_forced_local)
Nick Clifton 6893f2
+				    bool* resolve_oldsym,
Nick Clifton 6893f2
+				    bool is_forced_local,
Nick Clifton 6893f2
+				    bool must_be_in_reg)
Nick Clifton 6893f2
 {
Nick Clifton 6893f2
   *resolve_oldsym = false;
Nick Clifton 6893f2
   *poldsym = NULL;
Nick Clifton 6893f2
@@ -1797,7 +1799,11 @@ Symbol_table::define_special_symbol(cons
Nick Clifton 6893f2
       oldsym = this->lookup(*pname, *pversion);
Nick Clifton 6893f2
       if (oldsym == NULL && is_default_version)
Nick Clifton 6893f2
 	oldsym = this->lookup(*pname, NULL);
Nick Clifton 6893f2
-      if (oldsym == NULL || !oldsym->is_undefined())
Nick Clifton 6893f2
+      // If the symbol must be defined in a regular object, ignore
Nick Clifton 6893f2
+      // definition from a dynamic object.
Nick Clifton 6893f2
+      if (oldsym == NULL
Nick Clifton 6893f2
+	  || (!oldsym->is_undefined()
Nick Clifton 6893f2
+	      && (!must_be_in_reg || !oldsym->is_from_dynobj())))
Nick Clifton 6893f2
 	return NULL;
Nick Clifton 6893f2
 
Nick Clifton 6893f2
       *pname = oldsym->name();
Nick Clifton 6893f2
@@ -1916,7 +1922,8 @@ Symbol_table::define_in_output_data(cons
Nick Clifton 6893f2
 				    elfcpp::STV visibility,
Nick Clifton 6893f2
 				    unsigned char nonvis,
Nick Clifton 6893f2
 				    bool offset_is_from_end,
Nick Clifton 6893f2
-				    bool only_if_ref)
Nick Clifton 6893f2
+				    bool only_if_ref,
Nick Clifton 6893f2
+				    bool must_be_in_reg)
Nick Clifton 6893f2
 {
Nick Clifton 6893f2
   if (parameters->target().get_size() == 32)
Nick Clifton 6893f2
     {
Nick Clifton 6893f2
@@ -1925,7 +1932,8 @@ Symbol_table::define_in_output_data(cons
Nick Clifton 6893f2
                                                 value, symsize, type, binding,
Nick Clifton 6893f2
                                                 visibility, nonvis,
Nick Clifton 6893f2
                                                 offset_is_from_end,
Nick Clifton 6893f2
-                                                only_if_ref);
Nick Clifton 6893f2
+                                                only_if_ref,
Nick Clifton 6893f2
+                                                must_be_in_reg);
Nick Clifton 6893f2
 #else
Nick Clifton 6893f2
       gold_unreachable();
Nick Clifton 6893f2
 #endif
Nick Clifton 6893f2
@@ -1937,7 +1945,8 @@ Symbol_table::define_in_output_data(cons
Nick Clifton 6893f2
                                                 value, symsize, type, binding,
Nick Clifton 6893f2
                                                 visibility, nonvis,
Nick Clifton 6893f2
                                                 offset_is_from_end,
Nick Clifton 6893f2
-                                                only_if_ref);
Nick Clifton 6893f2
+                                                only_if_ref,
Nick Clifton 6893f2
+                                                must_be_in_reg);
Nick Clifton 6893f2
 #else
Nick Clifton 6893f2
       gold_unreachable();
Nick Clifton 6893f2
 #endif
Nick Clifton 6893f2
@@ -1962,7 +1971,8 @@ Symbol_table::do_define_in_output_data(
Nick Clifton 6893f2
     elfcpp::STV visibility,
Nick Clifton 6893f2
     unsigned char nonvis,
Nick Clifton 6893f2
     bool offset_is_from_end,
Nick Clifton 6893f2
-    bool only_if_ref)
Nick Clifton 6893f2
+    bool only_if_ref,
Nick Clifton 6893f2
+    bool must_be_in_reg)
Nick Clifton 6893f2
 {
Nick Clifton 6893f2
   Sized_symbol<size>* sym;
Nick Clifton 6893f2
   Sized_symbol<size>* oldsym;
Nick Clifton 6893f2
@@ -1975,7 +1985,8 @@ Symbol_table::do_define_in_output_data(
Nick Clifton 6893f2
       sym = this->define_special_symbol<size, true>(&name, &version,
Nick Clifton 6893f2
 						    only_if_ref, &oldsym,
Nick Clifton 6893f2
 						    &resolve_oldsym,
Nick Clifton 6893f2
-						    is_forced_local);
Nick Clifton 6893f2
+						    is_forced_local,
Nick Clifton 6893f2
+						    must_be_in_reg);
Nick Clifton 6893f2
 #else
Nick Clifton 6893f2
       gold_unreachable();
Nick Clifton 6893f2
 #endif
Nick Clifton 6893f2
@@ -1986,7 +1997,8 @@ Symbol_table::do_define_in_output_data(
Nick Clifton 6893f2
       sym = this->define_special_symbol<size, false>(&name, &version,
Nick Clifton 6893f2
 						     only_if_ref, &oldsym,
Nick Clifton 6893f2
 						     &resolve_oldsym,
Nick Clifton 6893f2
-						     is_forced_local);
Nick Clifton 6893f2
+						     is_forced_local,
Nick Clifton 6893f2
+						     must_be_in_reg);
Nick Clifton 6893f2
 #else
Nick Clifton 6893f2
       gold_unreachable();
Nick Clifton 6893f2
 #endif
Nick Clifton 6893f2
diff -rup binutils.orig/gold/symtab.h binutils-2.29.1/gold/symtab.h
Nick Clifton 6893f2
--- binutils.orig/gold/symtab.h	2017-10-18 12:00:32.002714624 +0100
Nick Clifton 6893f2
+++ binutils-2.29.1/gold/symtab.h	2017-10-18 12:00:41.352604062 +0100
Nick Clifton 6893f2
@@ -1488,7 +1488,8 @@ class Symbol_table
Nick Clifton 6893f2
 			Output_data*, uint64_t value, uint64_t symsize,
Nick Clifton 6893f2
 			elfcpp::STT type, elfcpp::STB binding,
Nick Clifton 6893f2
 			elfcpp::STV visibility, unsigned char nonvis,
Nick Clifton 6893f2
-			bool offset_is_from_end, bool only_if_ref);
Nick Clifton 6893f2
+			bool offset_is_from_end, bool only_if_ref,
Nick Clifton 6893f2
+			bool must_be_in_reg = false);
Nick Clifton 6893f2
 
Nick Clifton 6893f2
   // Define a special symbol based on an Output_segment.  It is a
Nick Clifton 6893f2
   // multiple definition error if this symbol is already defined.
Nick Clifton 6893f2
@@ -1803,7 +1804,8 @@ class Symbol_table
Nick Clifton 6893f2
   Sized_symbol<size>*
Nick Clifton 6893f2
   define_special_symbol(const char** pname, const char** pversion,
Nick Clifton 6893f2
 			bool only_if_ref, Sized_symbol<size>** poldsym,
Nick Clifton 6893f2
-			bool* resolve_oldsym, bool is_forced_local);
Nick Clifton 6893f2
+			bool* resolve_oldsym, bool is_forced_local,
Nick Clifton 6893f2
+			bool must_be_in_reg = false);
Nick Clifton 6893f2
 
Nick Clifton 6893f2
   // Define a symbol in an Output_data, sized version.
Nick Clifton 6893f2
   template<int size>
Nick Clifton 6893f2
@@ -1814,7 +1816,8 @@ class Symbol_table
Nick Clifton 6893f2
 			   typename elfcpp::Elf_types<size>::Elf_WXword ssize,
Nick Clifton 6893f2
 			   elfcpp::STT type, elfcpp::STB binding,
Nick Clifton 6893f2
 			   elfcpp::STV visibility, unsigned char nonvis,
Nick Clifton 6893f2
-			   bool offset_is_from_end, bool only_if_ref);
Nick Clifton 6893f2
+			   bool offset_is_from_end, bool only_if_ref,
Nick Clifton 6893f2
+			   bool must_be_in_reg = false);
Nick Clifton 6893f2
 
Nick Clifton 6893f2
   // Define a symbol in an Output_segment, sized version.
Nick Clifton 6893f2
   template<int size>
Nick Clifton 6893f2
Only in binutils-2.29.1/gold: symtab.h.orig