This is a fix for PR ld/16744 which showed that an object file linked with -r and...
authorNick Clifton <nickc@redhat.com>
Mon, 31 Mar 2014 12:14:44 +0000 (13:14 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 31 Mar 2014 12:14:44 +0000 (13:14 +0100)
would not honour the [no]execstack.  Fully linked binaries use a special segment to indicate the
state of the stack, but relocatable object files only have sections, and .note.GNU-stack was not
being created.

* emultempl/elf32.em (_after_open): Create a .note.GNU-stack
section when performing a relocatable link with -z [no]execstack
specified.

ld/ChangeLog
ld/emultempl/elf32.em

index f957e6dc0fc4b1abf20966ae1795239ac84e2a2b..d823aa496f3ce99cbd5544fe632e4f2778e38de7 100644 (file)
@@ -1,3 +1,10 @@
+2014-03-31  Nick Clifton  <nickc@redhat.com>
+
+       PR ld/16744
+       * emultempl/elf32.em (_after_open): Create a .note.GNU-stack
+       section when performing a relocatable link with -z [no]execstack
+       specified.
+
 2014-03-27  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/16756
index 7ea5adcc42b23cbd317351b383e7a7507046bde6..de460a274f2e262d25970aff8d21420d216a2669 100644 (file)
@@ -1112,7 +1112,20 @@ gld${EMULATION_NAME}_after_open (void)
     }
 
   if (link_info.relocatable)
-    return;
+    {
+      if (link_info.execstack == ! link_info.noexecstack)
+       /* PR ld/16744: If "-z [no]execstack" has been specified on the
+          command line and we are perfoming a relocatable link then no
+          PT_GNU_STACK segment will be created and so the
+          linkinfo.[no]execstack values set in _handle_option() will have no
+          effect.  Instead we create a .note.GNU-stack section in much the
+          same way as the assembler does with its --[no]execstack option.  */
+       (void) bfd_make_section_with_flags (link_info.input_bfds,
+                                           ".note.GNU-stack",
+                                           SEC_READONLY | (link_info.execstack ? SEC_CODE : 0));
+
+      return;
+    }
 
   if (link_info.eh_frame_hdr
       && !link_info.traditional_format)