[GOLD][PATCH] Use PIC ARM stubs in position independent executables too.

Doug Kwan (關振德) dougkwan@google.com
Thu Feb 2 19:35:00 GMT 2012


Hi Ian,

    This is a simple fix for a problem in ARM stubs in PIE.  Currently
we use some non-PIC stubs in a PIE, making the executable not really
position independent and causes it to crash.  This fix is to change
the selection of PIC/non-PIC stub using
options().output_is_position_independent() instead of
options().shared().

-Doug

2012-02-02  Doug Kwan  <dougkwan@google.com>

        * arm.cc (Reloc_stub::stub_type_for_reloc): Use PIC stubs in all
        position independent outputs, not just shared objects.
-------------- next part --------------
? gold/autom4te.cache
Index: gold/arm.cc
===================================================================
RCS file: /cvs/src/src/gold/arm.cc,v
retrieving revision 1.144
diff -u -u -p -r1.144 arm.cc
--- gold/arm.cc	28 Jan 2012 01:47:01 -0000	1.144
+++ gold/arm.cc	2 Feb 2012 19:24:01 -0000
@@ -4442,6 +4442,8 @@ Reloc_stub::stub_type_for_reloc(
     }
 
   int64_t branch_offset;
+  bool output_is_position_independent =
+      parameters->options().output_is_position_independent();
   if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
     {
       // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
@@ -4470,7 +4472,7 @@ Reloc_stub::stub_type_for_reloc(
 	      // Thumb to thumb.
 	      if (!thumb_only)
 		{
-		  stub_type = (parameters->options().shared()
+		  stub_type = (output_is_position_independent
 			       || should_force_pic_veneer)
 		    // PIC stubs.
 		    ? ((may_use_blx
@@ -4491,7 +4493,7 @@ Reloc_stub::stub_type_for_reloc(
 		}
 	      else
 		{
-		  stub_type = (parameters->options().shared()
+		  stub_type = (output_is_position_independent
 			       || should_force_pic_veneer)
 		    ? arm_stub_long_branch_thumb_only_pic	// PIC stub.
 		    : arm_stub_long_branch_thumb_only;	// non-PIC stub.
@@ -4504,7 +4506,7 @@ Reloc_stub::stub_type_for_reloc(
 	      // FIXME: We should check that the input section is from an
 	      // object that has interwork enabled.
 
-	      stub_type = (parameters->options().shared()
+	      stub_type = (output_is_position_independent
 			   || should_force_pic_veneer)
 		// PIC stubs.
 		? ((may_use_blx
@@ -4546,7 +4548,7 @@ Reloc_stub::stub_type_for_reloc(
 	      || (r_type == elfcpp::R_ARM_JUMP24)
 	      || (r_type == elfcpp::R_ARM_PLT32))
 	    {
-	      stub_type = (parameters->options().shared()
+	      stub_type = (output_is_position_independent
 			   || should_force_pic_veneer)
 		// PIC stubs.
 		? (may_use_blx
@@ -4565,7 +4567,7 @@ Reloc_stub::stub_type_for_reloc(
 	  if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
 	      || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
 	    {
-	      stub_type = (parameters->options().shared()
+	      stub_type = (output_is_position_independent
 			   || should_force_pic_veneer)
 		? arm_stub_long_branch_any_arm_pic	// PIC stubs.
 		: arm_stub_long_branch_any_any;		/// non-PIC.


More information about the Binutils mailing list