From 76f0cad6f4e0fdfc4cfeee135b44b6a090919c60 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 31 Mar 2014 13:14:44 +0100 Subject: [PATCH 1/1] This is a fix for PR ld/16744 which showed that an object file linked with -r and -z [no]execstack 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 | 7 +++++++ ld/emultempl/elf32.em | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index f957e6d..d823aa4 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2014-03-31 Nick Clifton + + 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 PR ld/16756 diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 7ea5adc..de460a2 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -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) -- 2.7.4