x86: Support Intel Shadow Stack with SHSTK property
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Jun 2017 12:50:20 +0000 (05:50 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Jun 2017 12:50:31 +0000 (05:50 -0700)
To support Intel Shadow Stack (SHSTK) in Intel Control-flow Enforcement
Technology (CET) instructions:

https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf

 #define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1)

is added to GNU program properties to indicate that all executable sections
are compatible with SHSTK where return address popped from shadow stack
always matches return address popped from normal stack.

GNU_PROPERTY_X86_FEATURE_1_SHSTK is set on output only if it is set on all
relocatable inputs.

bfd/

* elf32-i386.c (elf_i386_merge_gnu_properties): If info->shstk
is set, turn on GNU_PROPERTY_X86_FEATURE_1_SHSTK.
(elf_i386_link_setup_gnu_properties): If info->shstk is set,
turn on GNU_PROPERTY_X86_FEATURE_1_IBT.
* elf64-x86-64.c (elf_x86_64_merge_gnu_properties): If
info->shstk is set, turn on GNU_PROPERTY_X86_FEATURE_1_SHSTK.
(elf_x86_64_link_setup_gnu_properties): If info->shstk is set,
turn on GNU_PROPERTY_X86_FEATURE_1_IBT.

binutils/

* readelf.c (decode_x86_feature): Decode
GNU_PROPERTY_X86_FEATURE_1_SHSTK.
* testsuite/binutils-all/i386/shstk.d: New file.
* testsuite/binutils-all/i386/shstk.s: Likewise.
* testsuite/binutils-all/x86-64/shstk-x32.d: Likewise.
* testsuite/binutils-all/x86-64/shstk.d: Likewise.
* testsuite/binutils-all/x86-64/shstk.s: Likewise.

include/

* bfdlink.h (bfd_link_info): Add shstk.
* elf/common.h (GNU_PROPERTY_X86_FEATURE_1_SHSTK): New.

ld/

* NEWS: Mention -z shstk and GNU_PROPERTY_X86_FEATURE_1_SHSTK.
* emulparams/cet.sh (PARSE_AND_LIST_OPTIONS_CET): Add "-z shstk".
(PARSE_AND_LIST_ARGS_CASE_Z_CET): Support "-z shstk".
* ld.texinfo: Document -z shstk.
* testsuite/ld-i386/i386.exp: Run SHSTK tests.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/property-x86-shstk.s: New file.
* testsuite/ld-i386/property-x86-shstk1a.d: Likewise.
* testsuite/ld-i386/property-x86-shstk1b.d: Likewise.
* testsuite/ld-i386/property-x86-shstk2.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3a.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3b.d: Likewise.
* testsuite/ld-i386/property-x86-shstk4.d: Likewise.
* testsuite/ld-i386/property-x86-shstk5.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk.s: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1a.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1b.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk2-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk2.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk4-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk4.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk5-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk5.d: Likewise.

42 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
binutils/ChangeLog
binutils/readelf.c
binutils/testsuite/binutils-all/i386/shstk.d [new file with mode: 0644]
binutils/testsuite/binutils-all/i386/shstk.s [new file with mode: 0644]
binutils/testsuite/binutils-all/x86-64/shstk-x32.d [new file with mode: 0644]
binutils/testsuite/binutils-all/x86-64/shstk.d [new file with mode: 0644]
binutils/testsuite/binutils-all/x86-64/shstk.s [new file with mode: 0644]
include/ChangeLog
include/bfdlink.h
include/elf/common.h
ld/ChangeLog
ld/NEWS
ld/emulparams/cet.sh
ld/ld.texinfo
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/property-x86-shstk.s [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk1a.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk1b.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk2.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk3a.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk3b.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk4.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk5.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1a-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1b-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk2-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk4-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk4.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk5-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk5.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index ac13db32788e98c4c155d55ec9c7cc7ead7ffb36..647af617a83d77c0da85b906caaeac82c089f07e 100644 (file)
@@ -1,3 +1,14 @@
+2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf32-i386.c (elf_i386_merge_gnu_properties): If info->shstk
+       is set, turn on GNU_PROPERTY_X86_FEATURE_1_SHSTK.
+       (elf_i386_link_setup_gnu_properties): If info->shstk is set,
+       turn on GNU_PROPERTY_X86_FEATURE_1_IBT.
+       * elf64-x86-64.c (elf_x86_64_merge_gnu_properties): If
+       info->shstk is set, turn on GNU_PROPERTY_X86_FEATURE_1_SHSTK.
+       (elf_x86_64_link_setup_gnu_properties): If info->shstk is set,
+       turn on GNU_PROPERTY_X86_FEATURE_1_IBT.
+
 2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf32-i386.c (elf_i386_lazy_ibt_plt0_entry): New.
index d66281654810b09a080348523058749ca35587f9..ee8219cbbe402982e42d2ebfe20195830e4348ea 100644 (file)
@@ -6751,8 +6751,11 @@ elf_i386_merge_gnu_properties (struct bfd_link_info *info,
          features = 0;
          if (info->ibt)
            features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+         if (info->shstk)
+           features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
          number = aprop->u.number;
-         /* Add GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+         /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
+            GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
          aprop->u.number = (number & bprop->u.number) | features;
          updated = number != (unsigned int) aprop->u.number;
          /* Remove the property if all feature bits are cleared.  */
@@ -6764,9 +6767,12 @@ elf_i386_merge_gnu_properties (struct bfd_link_info *info,
          features = 0;
          if (info->ibt)
            features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+         if (info->shstk)
+           features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
          if (features)
            {
-             /* Add GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+             /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
+                GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
              if (aprop != NULL)
                {
                  number = aprop->u.number;
@@ -6813,9 +6819,12 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
   features = 0;
   if (info->ibt)
     features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+  if (info->shstk)
+    features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
   if (features)
     {
-      /* Turn on GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+      /* Turn on GNU_PROPERTY_X86_FEATURE_1_IBT and
+        GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
       bfd *ebfd = NULL;
       elf_property *prop;
 
@@ -6833,7 +6842,8 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
                prop = _bfd_elf_get_property (pbfd,
                                              GNU_PROPERTY_X86_FEATURE_1_AND,
                                              4);
-               /* Add GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+               /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
+                  GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
                prop->u.number |= features;
                prop->pr_kind = property_number;
                break;
index 1f8e6d0ebde23ef2119f28b01d6394ca56cc921b..1a9bebe668f930b6518a9a418498d8ee14f5957c 100644 (file)
@@ -7286,8 +7286,11 @@ elf_x86_64_merge_gnu_properties (struct bfd_link_info *info,
          features = 0;
          if (info->ibt)
            features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+         if (info->shstk)
+           features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
          number = aprop->u.number;
-         /* Add GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+         /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
+            GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
          aprop->u.number = (number & bprop->u.number) | features;
          updated = number != (unsigned int) aprop->u.number;
          /* Remove the property if all feature bits are cleared.  */
@@ -7299,9 +7302,12 @@ elf_x86_64_merge_gnu_properties (struct bfd_link_info *info,
          features = 0;
          if (info->ibt)
            features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+         if (info->shstk)
+           features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
          if (features)
            {
-             /* Add GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+             /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
+                GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
              if (aprop != NULL)
                {
                  number = aprop->u.number;
@@ -7348,9 +7354,12 @@ elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info)
   features = 0;
   if (info->ibt)
     features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+  if (info->shstk)
+    features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
   if (features)
     {
-      /* Turn on GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+      /* Turn on GNU_PROPERTY_X86_FEATURE_1_IBT and
+        GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
       bfd *ebfd = NULL;
       elf_property *prop;
 
@@ -7368,7 +7377,8 @@ elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info)
                prop = _bfd_elf_get_property (pbfd,
                                              GNU_PROPERTY_X86_FEATURE_1_AND,
                                              4);
-               /* Add GNU_PROPERTY_X86_FEATURE_1_IBT.  */
+               /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
+                  GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
                prop->u.number |= features;
                prop->pr_kind = property_number;
                break;
index 3870711754ea6b10fe427dde31163c1225bea242..484632addb5679a160ab587fee362f919fc4305e 100644 (file)
@@ -1,3 +1,13 @@
+2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * readelf.c (decode_x86_feature): Decode
+       GNU_PROPERTY_X86_FEATURE_1_SHSTK.
+       * testsuite/binutils-all/i386/shstk.d: New file.
+       * testsuite/binutils-all/i386/shstk.s: Likewise.
+       * testsuite/binutils-all/x86-64/shstk-x32.d: Likewise.
+       * testsuite/binutils-all/x86-64/shstk.d: Likewise.
+       * testsuite/binutils-all/x86-64/shstk.s: Likewise.
+
 2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * readelf.c (decode_x86_feature): New.
index 50354c1bd22e52e020428f75ffc116934db85807..d23a020c2e78b6a7a2e385d6b44e1b0f055a78fc 100644 (file)
@@ -16358,6 +16358,17 @@ decode_x86_feature (unsigned int type, unsigned int bitmask)
              abort ();
            }
          break;
+       case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
+         switch (type)
+           {
+           case GNU_PROPERTY_X86_FEATURE_1_AND:
+             printf ("SHSTK");
+             break;
+           default:
+             /* This should never happen.  */
+             abort ();
+           }
+         break;
        default:
          printf (_("<unknown: %x>"), bit);
          break;
diff --git a/binutils/testsuite/binutils-all/i386/shstk.d b/binutils/testsuite/binutils-all/i386/shstk.d
new file mode 100644 (file)
index 0000000..933704c
--- /dev/null
@@ -0,0 +1,9 @@
+#PROG: objcopy
+#as: --32
+#objcopy:
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/binutils/testsuite/binutils-all/i386/shstk.s b/binutils/testsuite/binutils-all/i386/shstk.s
new file mode 100644 (file)
index 0000000..4c3218a
--- /dev/null
@@ -0,0 +1,27 @@
+       .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+2:     .long 0xc0000002        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x2
+4:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+5:
diff --git a/binutils/testsuite/binutils-all/x86-64/shstk-x32.d b/binutils/testsuite/binutils-all/x86-64/shstk-x32.d
new file mode 100644 (file)
index 0000000..1dfc4fd
--- /dev/null
@@ -0,0 +1,10 @@
+#source: shstk.s
+#PROG: objcopy
+#as: --x32
+#objcopy:
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/binutils/testsuite/binutils-all/x86-64/shstk.d b/binutils/testsuite/binutils-all/x86-64/shstk.d
new file mode 100644 (file)
index 0000000..1f131b8
--- /dev/null
@@ -0,0 +1,9 @@
+#PROG: objcopy
+#as: --64 -defsym __64_bit__=1
+#objcopy:
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000010      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/binutils/testsuite/binutils-all/x86-64/shstk.s b/binutils/testsuite/binutils-all/x86-64/shstk.s
new file mode 100644 (file)
index 0000000..4c3218a
--- /dev/null
@@ -0,0 +1,27 @@
+       .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+2:     .long 0xc0000002        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x2
+4:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+5:
index 4858699a7ee5b6adfcdaff6b4d02c46288d7c3ea..d8730deab117d60c1a6fae89afc59bef2b94ef8e 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * bfdlink.h (bfd_link_info): Add shstk.
+       * elf/common.h (GNU_PROPERTY_X86_FEATURE_1_SHSTK): New.
+
 2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * bfdlink.h (bfd_link_info): Add ibtplt and ibt.
index 3b4dce9ca611197a2ec9ae9e4c6cbbc66a429118..e7c7836f7fa3fc8fb7017f71fb2b808f7d515468 100644 (file)
@@ -477,6 +477,9 @@ struct bfd_link_info
   /* TRUE if GNU_PROPERTY_X86_FEATURE_1_IBT should be generated.  */
   unsigned int ibt: 1;
 
+  /* TRUE if GNU_PROPERTY_X86_FEATURE_1_SHSTK should be generated.  */
+  unsigned int shstk: 1;
+
   /* TRUE if generation of .interp/PT_INTERP should be suppressed.  */
   unsigned int nointerp: 1;
 
index e638ba09ae6743b84ba6a801625735f1318230b2..8ca14bcbea767b52d6631f078a271137027e6bea 100644 (file)
 #define GNU_PROPERTY_X86_ISA_1_AVX512BW      (1U << 17)
 
 #define GNU_PROPERTY_X86_FEATURE_1_IBT       (1U << 0)
+#define GNU_PROPERTY_X86_FEATURE_1_SHSTK     (1U << 1)
 
 /* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG).  */
 #define GNU_ABI_TAG_LINUX      0
index b3567e112ece83dc3795322c099fc24e189adf99..bdc5853a7aa3fdd1acb7247d64a9570c549dccb7 100644 (file)
@@ -1,3 +1,35 @@
+2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * NEWS: Mention -z shstk and GNU_PROPERTY_X86_FEATURE_1_SHSTK.
+       * emulparams/cet.sh (PARSE_AND_LIST_OPTIONS_CET): Add "-z shstk".
+       (PARSE_AND_LIST_ARGS_CASE_Z_CET): Support "-z shstk".
+       * ld.texinfo: Document -z shstk.
+       * testsuite/ld-i386/i386.exp: Run SHSTK tests.
+       * testsuite/ld-x86-64/x86-64.exp: Likewise.
+       * testsuite/ld-i386/property-x86-shstk.s: New file.
+       * testsuite/ld-i386/property-x86-shstk1a.d: Likewise.
+       * testsuite/ld-i386/property-x86-shstk1b.d: Likewise.
+       * testsuite/ld-i386/property-x86-shstk2.d: Likewise.
+       * testsuite/ld-i386/property-x86-shstk3a.d: Likewise.
+       * testsuite/ld-i386/property-x86-shstk3b.d: Likewise.
+       * testsuite/ld-i386/property-x86-shstk4.d: Likewise.
+       * testsuite/ld-i386/property-x86-shstk5.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk.s: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk1a-x32.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk1a.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk1b-x32.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk1b.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk2-x32.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk2.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk3a-x32.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk3a.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk3b-x32.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk3b.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk4-x32.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk4.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk5-x32.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-shstk5.d: Likewise.
+
 2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * Makefile.am (ELF_X86_DEPS): Add $(srcdir)/emulparams/cet.sh.
diff --git a/ld/NEWS b/ld/NEWS
index b11584314650a5625ad03e1da76b03e452a18482..e9ef7136ef4746ca9f4ed948f9f328fd993e28df 100644 (file)
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,6 +1,13 @@
 -*- text -*-
 
+* Support for -z shstk in the x86 ELF linker to generate
+  GNU_PROPERTY_X86_FEATURE_1_SHSTK in ELF GNU program properties.
+
+* Add support for GNU_PROPERTY_X86_FEATURE_1_SHSTK in ELF GNU program
+  properties in the x86 ELF linker.
+
 * Add support for GNU_PROPERTY_X86_FEATURE_1_IBT in ELF GNU program
+  properties in the x86 ELF linker.
 
 * Support for -z ibtplt in the x86 ELF linker to generate IBT-enabled
   PLT.
index 62ff105613f85831d4cd90e8f9df0dc635b2c5c4..1973413c9005e9b678ab588092ae3f912fece196 100644 (file)
@@ -1,13 +1,16 @@
 PARSE_AND_LIST_OPTIONS_CET='
   fprintf (file, _("\
   -z ibtplt                   Generate IBT-enabled PLT entries\n\
-  -z ibt                      Generate GNU_PROPERTY_X86_FEATURE_1_IBT\n"));
+  -z ibt                      Generate GNU_PROPERTY_X86_FEATURE_1_IBT\n\
+  -z shstk                    Generate GNU_PROPERTY_X86_FEATURE_1_SHSTK\n"));
 '
 PARSE_AND_LIST_ARGS_CASE_Z_CET='
       else if (strcmp (optarg, "ibtplt") == 0)
        link_info.ibtplt = TRUE;
       else if (strcmp (optarg, "ibt") == 0)
        link_info.ibt = TRUE;
+      else if (strcmp (optarg, "shstk") == 0)
+       link_info.shstk = TRUE;
 '
 
 PARSE_AND_LIST_OPTIONS="$PARSE_AND_LIST_OPTIONS $PARSE_AND_LIST_OPTIONS_CET"
index 4f7873cd905518b4407d85ede9b6ebe968c75dac..77b5d3eec1253c39cedd68f89cb7fd4b34dc1fa6 100644 (file)
@@ -1270,6 +1270,11 @@ Generate GNU_PROPERTY_X86_FEATURE_1_IBT in .note.gnu.property section
 to indicate compatibility with IBT.  This also implies @option{ibtplt}.
 Supported for Linux/i386 and Linux/x86_64.
 
+@item shstk
+Generate GNU_PROPERTY_X86_FEATURE_1_SHSTK in .note.gnu.property section
+to indicate compatibility with Intel Shadow Stack.  Supported for
+Linux/i386 and Linux/x86_64.
+
 @end table
 
 Other keywords are ignored for Solaris compatibility.
index d30dc767036978f1c0e22e622425d8e85cfda355..1cecea4e38e6732196d96e108cc89126b9032c64 100644 (file)
@@ -427,6 +427,13 @@ run_dump_test "property-x86-ibt3a"
 run_dump_test "property-x86-ibt3b"
 run_dump_test "property-x86-ibt4"
 run_dump_test "property-x86-ibt5"
+run_dump_test "property-x86-shstk1a"
+run_dump_test "property-x86-shstk1b"
+run_dump_test "property-x86-shstk2"
+run_dump_test "property-x86-shstk3a"
+run_dump_test "property-x86-shstk3b"
+run_dump_test "property-x86-shstk4"
+run_dump_test "property-x86-shstk5"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/property-x86-shstk.s b/ld/testsuite/ld-i386/property-x86-shstk.s
new file mode 100644 (file)
index 0000000..4c3218a
--- /dev/null
@@ -0,0 +1,27 @@
+       .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+2:     .long 0xc0000002        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x2
+4:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+5:
diff --git a/ld/testsuite/ld-i386/property-x86-shstk1a.d b/ld/testsuite/ld-i386/property-x86-shstk1a.d
new file mode 100644 (file)
index 0000000..238cebe
--- /dev/null
@@ -0,0 +1,6 @@
+#source: property-x86-empty.s
+#source: property-x86-shstk.s
+#as: --32
+#ld: -r -melf_i386
+#readelf: -n
+
diff --git a/ld/testsuite/ld-i386/property-x86-shstk1b.d b/ld/testsuite/ld-i386/property-x86-shstk1b.d
new file mode 100644 (file)
index 0000000..faa2ea7
--- /dev/null
@@ -0,0 +1,6 @@
+#source: property-x86-shstk.s
+#source: property-x86-empty.s
+#as: --32
+#ld: -r -melf_i386
+#readelf: -n
+
diff --git a/ld/testsuite/ld-i386/property-x86-shstk2.d b/ld/testsuite/ld-i386/property-x86-shstk2.d
new file mode 100644 (file)
index 0000000..b39fa58
--- /dev/null
@@ -0,0 +1,9 @@
+#source: property-x86-shstk.s
+#as: --32
+#ld: -r -melf_i386
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-i386/property-x86-shstk3a.d b/ld/testsuite/ld-i386/property-x86-shstk3a.d
new file mode 100644 (file)
index 0000000..e261038
--- /dev/null
@@ -0,0 +1,11 @@
+#source: property-x86-3.s
+#source: property-x86-shstk.s
+#as: --32
+#ld: -r -melf_i386
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000018      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: i486, 586, SSE2, SSE3
+       x86 ISA needed: 586, SSE, SSE3, SSE4_1
diff --git a/ld/testsuite/ld-i386/property-x86-shstk3b.d b/ld/testsuite/ld-i386/property-x86-shstk3b.d
new file mode 100644 (file)
index 0000000..25f3d23
--- /dev/null
@@ -0,0 +1,11 @@
+#source: property-x86-shstk.s
+#source: property-x86-3.s
+#as: --32
+#ld: -r -melf_i386
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000018      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: i486, 586, SSE2, SSE3
+       x86 ISA needed: 586, SSE, SSE3, SSE4_1
diff --git a/ld/testsuite/ld-i386/property-x86-shstk4.d b/ld/testsuite/ld-i386/property-x86-shstk4.d
new file mode 100644 (file)
index 0000000..d962eab
--- /dev/null
@@ -0,0 +1,9 @@
+#source: property-x86-empty.s
+#as: --32
+#ld: -r -melf_i386 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-i386/property-x86-shstk5.d b/ld/testsuite/ld-i386/property-x86-shstk5.d
new file mode 100644 (file)
index 0000000..6d6371f
--- /dev/null
@@ -0,0 +1,9 @@
+#source: start.s
+#as: --32
+#ld: -r -melf_i386 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk.s b/ld/testsuite/ld-x86-64/property-x86-shstk.s
new file mode 100644 (file)
index 0000000..4c3218a
--- /dev/null
@@ -0,0 +1,27 @@
+       .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+2:     .long 0xc0000002        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x2
+4:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+5:
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk1a-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk1a-x32.d
new file mode 100644 (file)
index 0000000..312d1ea
--- /dev/null
@@ -0,0 +1,6 @@
+#source: property-x86-empty.s
+#source: property-x86-shstk.s
+#as: --x32
+#ld: -r -m elf32_x86_64
+#readelf: -n
+
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk1a.d b/ld/testsuite/ld-x86-64/property-x86-shstk1a.d
new file mode 100644 (file)
index 0000000..39a996e
--- /dev/null
@@ -0,0 +1,6 @@
+#source: property-x86-empty.s
+#source: property-x86-shstk.s
+#as: --64 -defsym __64_bit__=1
+#ld: -r -melf_x86_64
+#readelf: -n
+
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk1b-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk1b-x32.d
new file mode 100644 (file)
index 0000000..9e91c5c
--- /dev/null
@@ -0,0 +1,6 @@
+#source: property-x86-shstk.s
+#source: property-x86-empty.s
+#as: --x32
+#ld: -r -m elf32_x86_64
+#readelf: -n
+
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk1b.d b/ld/testsuite/ld-x86-64/property-x86-shstk1b.d
new file mode 100644 (file)
index 0000000..a9b9e62
--- /dev/null
@@ -0,0 +1,6 @@
+#source: property-x86-shstk.s
+#source: property-x86-empty.s
+#as: --64 -defsym __64_bit__=1
+#ld: -r -melf_x86_64
+#readelf: -n
+
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk2-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk2-x32.d
new file mode 100644 (file)
index 0000000..7155f3f
--- /dev/null
@@ -0,0 +1,9 @@
+#source: property-x86-shstk.s
+#as: --x32
+#ld: -r -m elf32_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk2.d b/ld/testsuite/ld-x86-64/property-x86-shstk2.d
new file mode 100644 (file)
index 0000000..7fbafe8
--- /dev/null
@@ -0,0 +1,9 @@
+#source: property-x86-shstk.s
+#as: --64 -defsym __64_bit__=1
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000010      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d
new file mode 100644 (file)
index 0000000..819542d
--- /dev/null
@@ -0,0 +1,11 @@
+#source: property-x86-3.s
+#source: property-x86-shstk.s
+#as: --x32
+#ld: -r -m elf32_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000018      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1
+       x86 ISA needed: i486, 586, SSE2, SSE3
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3a.d b/ld/testsuite/ld-x86-64/property-x86-shstk3a.d
new file mode 100644 (file)
index 0000000..4c5d0e0
--- /dev/null
@@ -0,0 +1,11 @@
+#source: property-x86-3.s
+#source: property-x86-shstk.s
+#as: --64 -defsym __64_bit__=1
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000020      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1
+       x86 ISA needed: i486, 586, SSE2, SSE3
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d
new file mode 100644 (file)
index 0000000..ba181e0
--- /dev/null
@@ -0,0 +1,11 @@
+#source: property-x86-shstk.s
+#source: property-x86-3.s
+#as: --x32
+#ld: -r -m elf32_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000018      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1
+       x86 ISA needed: i486, 586, SSE2, SSE3
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3b.d b/ld/testsuite/ld-x86-64/property-x86-shstk3b.d
new file mode 100644 (file)
index 0000000..5216f38
--- /dev/null
@@ -0,0 +1,11 @@
+#source: property-x86-shstk.s
+#source: property-x86-3.s
+#as: --64 -defsym __64_bit__=1
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000020      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1
+       x86 ISA needed: i486, 586, SSE2, SSE3
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk4-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk4-x32.d
new file mode 100644 (file)
index 0000000..61b7826
--- /dev/null
@@ -0,0 +1,9 @@
+#source: property-x86-empty.s
+#as: --x32
+#ld: -r -m elf32_x86_64 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk4.d b/ld/testsuite/ld-x86-64/property-x86-shstk4.d
new file mode 100644 (file)
index 0000000..c2a7b36
--- /dev/null
@@ -0,0 +1,9 @@
+#source: property-x86-empty.s
+#as: --64 -defsym __64_bit__=1
+#ld: -r -melf_x86_64 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000010      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk5-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk5-x32.d
new file mode 100644 (file)
index 0000000..83c6a68
--- /dev/null
@@ -0,0 +1,9 @@
+#source: start.s
+#as: --x32
+#ld: -r -m elf32_x86_64 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x0000000c      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk5.d b/ld/testsuite/ld-x86-64/property-x86-shstk5.d
new file mode 100644 (file)
index 0000000..9a4b186
--- /dev/null
@@ -0,0 +1,9 @@
+#source: start.s
+#as: --64 -defsym __64_bit__=1
+#ld: -r -melf_x86_64 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000010      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
index 6cde22ff58ef7913ba4fa529d1c2348918a9d81f..9b83e1c5ce8d84fd111ec40c9a7b60371f53ef43 100644 (file)
@@ -349,6 +349,20 @@ run_dump_test "property-x86-ibt4"
 run_dump_test "property-x86-ibt4-x32"
 run_dump_test "property-x86-ibt5"
 run_dump_test "property-x86-ibt5-x32"
+run_dump_test "property-x86-shstk1a"
+run_dump_test "property-x86-shstk1b"
+run_dump_test "property-x86-shstk1a-x32"
+run_dump_test "property-x86-shstk1b-x32"
+run_dump_test "property-x86-shstk2"
+run_dump_test "property-x86-shstk2-x32"
+run_dump_test "property-x86-shstk3a"
+run_dump_test "property-x86-shstk3b"
+run_dump_test "property-x86-shstk3a-x32"
+run_dump_test "property-x86-shstk3b-x32"
+run_dump_test "property-x86-shstk4"
+run_dump_test "property-x86-shstk4-x32"
+run_dump_test "property-x86-shstk5"
+run_dump_test "property-x86-shstk5-x32"
 
 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return