diff options
-rw-r--r-- | lld/ELF/InputFiles.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 86256250f97..9706eb66c5a 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -414,10 +414,18 @@ elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec, } } - // .note.GNU-stack is a marker section to control the presence of - // PT_GNU_STACK segment in outputs. Since the presence of the segment - // is controlled only by the command line option (-z execstack) in LLD, - // .note.GNU-stack is ignored. + // The GNU linker uses .note.GNU-stack section as a marker indicating + // that the code in the object file does not expect that the stack is + // executable (in terms of NX bit). If all input files have the marker, + // the GNU linker adds a PT_GNU_STACK segment to tells the loader to + // make the stack non-executable. + // + // But making the stack non-executable is a norm today for security + // reasons (as of 2017). Failure to do so may result in a serious + // security issue. Therefore, LLD always adds PT_GNU_STACK unless it is + // explicitly told to do otherwise (by -z execstack). Because the stack + // executable-ness is controlled solely by command line options, + // .note.GNU-stack sections are simply ignored. if (Name == ".note.GNU-stack") return &InputSection<ELFT>::Discarded; |