[lld] r340902 - Always add a .note.GNU-stack section if -r.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 29 00:27:09 PDT 2018


Author: ruiu
Date: Wed Aug 29 00:27:09 2018
New Revision: 340902

URL: http://llvm.org/viewvc/llvm-project?rev=340902&view=rev
Log:
Always add a .note.GNU-stack section if -r.

With this patch, lld creates a .note.GNU_stack and adds that to an
output file if it is creating a re-linkable object file (i.e. if -r
is given). If we don't do this, and if you use GNU linkers as a final
linker, they create an executable whose stack area is executable,
which is considered pretty bad these days.

Differential Revision: https://reviews.llvm.org/D51400

Modified:
    lld/trunk/ELF/SyntheticSections.h
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/ELF/relocatable-bss.s
    lld/trunk/test/ELF/relocatable-comdat-multiple.s
    lld/trunk/test/ELF/relocatable-comdat.s
    lld/trunk/test/ELF/relocatable-comdat2.s
    lld/trunk/test/ELF/relocatable-many-sections.s
    lld/trunk/test/ELF/relocatable.s

Modified: lld/trunk/ELF/SyntheticSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.h (original)
+++ lld/trunk/ELF/SyntheticSections.h Wed Aug 29 00:27:09 2018
@@ -135,6 +135,15 @@ protected:
   uint64_t Size = 0;
 };
 
+// .note.GNU-stack section.
+class GnuStackSection : public SyntheticSection {
+public:
+  GnuStackSection()
+      : SyntheticSection(0, llvm::ELF::SHT_PROGBITS, 1, ".note.GNU-stack") {}
+  void writeTo(uint8_t *Buf) override {}
+  size_t getSize() const override { return 0; }
+};
+
 // .note.gnu.build-id section.
 class BuildIdSection : public SyntheticSection {
   // First 16 bytes are a header.

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Wed Aug 29 00:27:09 2018
@@ -399,6 +399,14 @@ template <class ELFT> static void create
   InX::Iplt = make<PltSection>(true);
   Add(InX::Iplt);
 
+  // .note.GNU-stack is always added when we are creating a re-linkable
+  // object file. Other linkers are using the presence of this marker
+  // section to control the executable-ness of the stack area, but that
+  // is irrelevant these days. Stack area should always be non-executable
+  // by default. So we emit this section unconditionally.
+  if (Config->Relocatable)
+    Add(make<GnuStackSection>());
+
   if (!Config->Relocatable) {
     if (Config->EhFrameHdr) {
       InX::EhFrameHdr = make<EhFrameHeader>();

Modified: lld/trunk/test/ELF/relocatable-bss.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-bss.s?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable-bss.s (original)
+++ lld/trunk/test/ELF/relocatable-bss.s Wed Aug 29 00:27:09 2018
@@ -20,7 +20,7 @@
 # CHECK-NEXT:  Version:
 # CHECK-NEXT:  Entry:
 # CHECK-NEXT:   ProgramHeaderOffset:
-# CHECK-NEXT:   SectionHeaderOffset: 0xD8
+# CHECK-NEXT:   SectionHeaderOffset: 0xE8
 # CHECK-NEXT:  Flags [
 # CHECK-NEXT:  ]
 # CHECK-NEXT:  HeaderSize:

Modified: lld/trunk/test/ELF/relocatable-comdat-multiple.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-comdat-multiple.s?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable-comdat-multiple.s (original)
+++ lld/trunk/test/ELF/relocatable-comdat-multiple.s Wed Aug 29 00:27:09 2018
@@ -8,7 +8,7 @@
 # CHECK-NEXT:   Group {
 # CHECK-NEXT:     Name: .group
 # CHECK-NEXT:     Index: 2
-# CHECK-NEXT:     Link: 8
+# CHECK-NEXT:     Link: 9
 # CHECK-NEXT:     Info: 1
 # CHECK-NEXT:     Type: COMDAT
 # CHECK-NEXT:     Signature: aaa
@@ -20,7 +20,7 @@
 # CHECK-NEXT:   Group {
 # CHECK-NEXT:     Name: .group
 # CHECK-NEXT:     Index: 5
-# CHECK-NEXT:     Link: 8
+# CHECK-NEXT:     Link: 9
 # CHECK-NEXT:     Info: 6
 # CHECK-NEXT:     Type: COMDAT
 # CHECK-NEXT:     Signature: bbb

Modified: lld/trunk/test/ELF/relocatable-comdat.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-comdat.s?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable-comdat.s (original)
+++ lld/trunk/test/ELF/relocatable-comdat.s Wed Aug 29 00:27:09 2018
@@ -30,7 +30,7 @@
 # CHECK-NEXT:    Group {
 # CHECK-NEXT:      Name: .group
 # CHECK-NEXT:      Index: 2
-# CHECK-NEXT:      Link: 5
+# CHECK-NEXT:      Link: 6
 # CHECK-NEXT:      Info: 1 
 # CHECK-NEXT:      Type: COMDAT
 # CHECK-NEXT:      Signature: abc

Modified: lld/trunk/test/ELF/relocatable-comdat2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-comdat2.s?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable-comdat2.s (original)
+++ lld/trunk/test/ELF/relocatable-comdat2.s Wed Aug 29 00:27:09 2018
@@ -13,7 +13,7 @@
 # CHECK-NEXT:   Group {
 # CHECK-NEXT:     Name: .group
 # CHECK-NEXT:     Index: 2
-# CHECK-NEXT:     Link: 7
+# CHECK-NEXT:     Link: 8
 # CHECK-NEXT:     Info: 1
 # CHECK-NEXT:     Type: COMDAT
 # CHECK-NEXT:     Signature: bar
@@ -24,7 +24,7 @@
 # CHECK-NEXT:   Group {
 # CHECK-NEXT:     Name: .group
 # CHECK-NEXT:     Index: 4
-# CHECK-NEXT:     Link: 7
+# CHECK-NEXT:     Link: 8
 # CHECK-NEXT:     Info: 2
 # CHECK-NEXT:     Type: COMDAT
 # CHECK-NEXT:     Signature: zed

Modified: lld/trunk/test/ELF/relocatable-many-sections.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-many-sections.s?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable-many-sections.s (original)
+++ lld/trunk/test/ELF/relocatable-many-sections.s Wed Aug 29 00:27:09 2018
@@ -9,8 +9,8 @@
 ## sections amount is greater than SHN_LORESERVE.
 # RUN: llvm-readobj -file-headers %t | FileCheck %s --check-prefix=HDR
 # HDR:      ElfHeader {
-# HDR:        SectionHeaderCount: 0 (65543)
-# HDR-NEXT:   StringTableSectionIndex: 65535 (65541)
+# HDR:        SectionHeaderCount: 0 (65544)
+# HDR-NEXT:   StringTableSectionIndex: 65535 (65542)
 
 ## Check that:
 ## 1) 65541 is the index of .shstrtab section.
@@ -18,13 +18,15 @@
 ## 3) .symtab_shndxr entry size and alignment == 4.
 ## 4) .symtab_shndxr has size equal to
 ##    (sizeof(.symtab) / entsize(.symtab)) * entsize(.symtab_shndxr) = 0x4 * 0x180048 / 0x18 == 0x04000c
+
 # RUN: llvm-readelf -sections -symbols %t | FileCheck %s
-##              [Nr]    Name           Type                   Address          Off    Size   ES Flg  Lk    Inf    Al
-# CHECK:        [65538] .bar
-# CHECK-NEXT:   [65539] .symtab        SYMTAB                 0000000000000000 000040 180078 18      65542 65539  8
-# CHECK-NEXT:   [65540] .symtab_shndxr SYMTAB SECTION INDICES 0000000000000000 1800b8 040014 04      65539 0      4
-# CHECK-NEXT:   [65541] .shstrtab      STRTAB                 0000000000000000 1c00cc 0f0035 00      0     0      1
-# CHECK-NEXT:   [65542] .strtab        STRTAB                 0000000000000000 2b0101 00000c 00
+#        [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
+# CHECK: [65539] .note.GNU-stack PROGBITS       0000000000000000 000040 000000 00      0   0  1
+# CHECK: [65540] .symtab        SYMTAB          0000000000000000 000040 180078 18     65543 65539  8
+# CHECK: [65541] .symtab_shndxr SYMTAB SECTION INDICES 0000000000000000 1800b8 040014 04     65540   0  4
+# CHECK: [65542] .shstrtab      STRTAB          0000000000000000 1c00cc 0f0045 00      0   0  1
+# CHECK: [65543] .strtab        STRTAB          0000000000000000 2b0111 00000c 00      0   0  1
+
 # 5) Check we are able to represent symbol foo with section (.bar) index  > 0xFF00 (SHN_LORESERVE).
 # CHECK: GLOBAL DEFAULT  65538 foo
 

Modified: lld/trunk/test/ELF/relocatable.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable.s?rev=340902&r1=340901&r2=340902&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable.s (original)
+++ lld/trunk/test/ELF/relocatable.s Wed Aug 29 00:27:09 2018
@@ -4,6 +4,7 @@
 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/relocatable2.s -o %t3.o
 # RUN: ld.lld -r %t1.o %t2.o %t3.o -o %t
 # RUN: llvm-readobj -file-headers -sections -program-headers -symbols -r %t | FileCheck %s
+# RUN: llvm-objdump -section-headers %t | FileCheck -check-prefix=SECTION %s
 # RUN: llvm-objdump -s -d %t | FileCheck -check-prefix=CHECKTEXT %s
 
 ## Test --relocatable alias
@@ -37,8 +38,8 @@
 # CHECK-NEXT:  ProgramHeaderEntrySize: 0
 # CHECK-NEXT:  ProgramHeaderCount: 0
 # CHECK-NEXT:  SectionHeaderEntrySize: 64
-# CHECK-NEXT:  SectionHeaderCount: 7
-# CHECK-NEXT:  StringTableSectionIndex: 5
+# CHECK-NEXT:  SectionHeaderCount: 8
+# CHECK-NEXT:  StringTableSectionIndex: 6
 # CHECK-NEXT:  }
 
 # CHECK:       Relocations [
@@ -51,6 +52,17 @@
 # CHECK-NEXT:    0x4E R_X86_64_32S yyy 0x0
 # CHECK-NEXT:  }
 
+# SECTION: Sections:
+# SECTION: Idx Name          Size      Address          Type
+# SECTION:   0               00000000 0000000000000000
+# SECTION:   1 .text         00000056 0000000000000000 TEXT
+# SECTION:   2 .rela.text    00000090 0000000000000000
+# SECTION:   3 .bss          00000018 0000000000000000 BSS
+# SECTION:   4 .note.GNU-stack 00000000 0000000000000000
+# SECTION:   5 .symtab       00000168 0000000000000000
+# SECTION:   6 .shstrtab     00000041 0000000000000000
+# SECTION:   7 .strtab       0000002d 0000000000000000
+
 # CHECKTEXT:      Disassembly of section .text:
 # CHECKTEXT-NEXT: main:
 # CHECKTEXT-NEXT: 0: c7 04 25 00 00 00 00 05 00 00 00 movl $5, 0




More information about the llvm-commits mailing list