x86: Properly merge -z ibt and -z shstk
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 6 Oct 2020 22:38:23 +0000 (15:38 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 6 Oct 2020 22:38:34 +0000 (15:38 -0700)
Merge -z ibt and -z shstk only with GNU_PROPERTY_X86_FEATURE_1_AND, not
any GNU_PROPERTY_X86_UINT32_AND_XXX properties.

bfd/

PR ld/26711
* elfxx-x86.c (_bfd_x86_elf_merge_gnu_properties): Merge -z ibt
and -z shstk only with GNU_PROPERTY_X86_FEATURE_1_AND.

ld/

PR ld/26711
* testsuite/ld-i386/i386.exp: Run ld/26711 tests.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr26711-1.d: Likewise.
* testsuite/ld-i386/pr26711-2.d: Likewise.
* testsuite/ld-i386/pr26711-3.d: Likewise.
* testsuite/ld-x86-64/pr26711-1-x32.d: Likewise.
* testsuite/ld-x86-64/pr26711-1.d: Likewise.
* testsuite/ld-x86-64/pr26711-2-x32.d: Likewise.
* testsuite/ld-x86-64/pr26711-2.d: Likewise.
* testsuite/ld-x86-64/pr26711-3-x32.d: Likewise.
* testsuite/ld-x86-64/pr26711-3.d: Likewise.
* testsuite/ld-x86-64/pr26711.s: Likewise.

15 files changed:
bfd/ChangeLog
bfd/elfxx-x86.c
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr26711-1.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr26711-2.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr26711-3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr26711-1-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr26711-1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr26711-2-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr26711-2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr26711-3-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr26711-3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr26711.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 5121889969fff1464362ce91adb31728c1b42268..468c6f64c31450bb43a917427fea868c24eea610 100644 (file)
@@ -1,3 +1,9 @@
+2020-10-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26711
+       * elfxx-x86.c (_bfd_x86_elf_merge_gnu_properties): Merge -z ibt
+       and -z shstk only with GNU_PROPERTY_X86_FEATURE_1_AND.
+
 2020-10-06  Brandon Bergren  <bdragon@FreeBSD.org>
 
        * config.bfd: Add powerpc64le-*-freebsd*.
index e58ddc19cf6201bf426c6ee2ca960a50049de2b6..143aae4b5cc273f783d4669a472c1a1775875cc8 100644 (file)
@@ -2417,15 +2417,19 @@ _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
        abort ();
       if (aprop != NULL && bprop != NULL)
        {
-         features = 0;
-         if (htab->params->ibt)
-           features = GNU_PROPERTY_X86_FEATURE_1_IBT;
-         if (htab->params->shstk)
-           features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
          number = aprop->u.number;
-         /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
-            GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
-         aprop->u.number = (number & bprop->u.number) | features;
+         aprop->u.number = number & bprop->u.number;
+         if (pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
+           {
+             features = 0;
+             if (htab->params->ibt)
+               features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+             if (htab->params->shstk)
+               features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+             /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
+                GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
+             aprop->u.number |= features;
+           }
          updated = number != (unsigned int) aprop->u.number;
          /* Remove the property if all feature bits are cleared.  */
          if (aprop->u.number == 0)
@@ -2437,10 +2441,13 @@ _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
             have them.  Set IBT and SHSTK properties for -z ibt and -z
             shstk if needed.  */
          features = 0;
-         if (htab->params->ibt)
-           features = GNU_PROPERTY_X86_FEATURE_1_IBT;
-         if (htab->params->shstk)
-           features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+         if (pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
+           {
+             if (htab->params->ibt)
+               features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+             if (htab->params->shstk)
+               features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+           }
          if (features)
            {
              if (aprop != NULL)
index 62937a1b90482a1f4b9ea32c4f338a35507619a2..17c0d971670e4b1e406539a8f9c0a16d7a0e6b87 100644 (file)
@@ -1,3 +1,19 @@
+2020-10-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26711
+       * testsuite/ld-i386/i386.exp: Run ld/26711 tests.
+       * testsuite/ld-x86-64/x86-64.exp: Likewise.
+       * testsuite/ld-i386/pr26711-1.d: Likewise.
+       * testsuite/ld-i386/pr26711-2.d: Likewise.
+       * testsuite/ld-i386/pr26711-3.d: Likewise.
+       * testsuite/ld-x86-64/pr26711-1-x32.d: Likewise.
+       * testsuite/ld-x86-64/pr26711-1.d: Likewise.
+       * testsuite/ld-x86-64/pr26711-2-x32.d: Likewise.
+       * testsuite/ld-x86-64/pr26711-2.d: Likewise.
+       * testsuite/ld-x86-64/pr26711-3-x32.d: Likewise.
+       * testsuite/ld-x86-64/pr26711-3.d: Likewise.
+       * testsuite/ld-x86-64/pr26711.s: Likewise.
+
 2020-10-06  Brandon Bergren  <bdragon@FreeBSD.org>
 
        * Makefile.am (ALL_64_EMULATION_SOURCES): Add eelf64lppc_fbsd.c.
index d0b8ed77bd1747fccd953e265df42cc71a7b68e3..cd7b4deebdeee232ff235227e8a1e212a65759c5 100644 (file)
@@ -472,6 +472,9 @@ run_dump_test "pr24322b"
 run_dump_test "align-branch-1"
 run_dump_test "pr26018"
 run_dump_test "pr26263"
+run_dump_test "pr26711-1"
+run_dump_test "pr26711-2"
+run_dump_test "pr26711-3"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr26711-1.d b/ld/testsuite/ld-i386/pr26711-1.d
new file mode 100644 (file)
index 0000000..24a8429
--- /dev/null
@@ -0,0 +1,10 @@
+#source: ../ld-x86-64/pr26711.s
+#source: ../ld-x86-64/start.s
+#as: --32 -mx86-used-note=no
+#ld: -m elf_i386 -z ibt
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: IBT
diff --git a/ld/testsuite/ld-i386/pr26711-2.d b/ld/testsuite/ld-i386/pr26711-2.d
new file mode 100644 (file)
index 0000000..e92559f
--- /dev/null
@@ -0,0 +1,10 @@
+#source: ../ld-x86-64/pr26711.s
+#source: ../ld-x86-64/start.s
+#as: --32 -mx86-used-note=no
+#ld: -m elf_i386 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-i386/pr26711-3.d b/ld/testsuite/ld-i386/pr26711-3.d
new file mode 100644 (file)
index 0000000..df9bfce
--- /dev/null
@@ -0,0 +1,10 @@
+#source: ../ld-x86-64/pr26711.s
+#source: ../ld-x86-64/start.s
+#as: --32 -mx86-used-note=no
+#ld: -m elf_i386 -z ibt -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: IBT, SHSTK
diff --git a/ld/testsuite/ld-x86-64/pr26711-1-x32.d b/ld/testsuite/ld-x86-64/pr26711-1-x32.d
new file mode 100644 (file)
index 0000000..6701319
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr26711.s
+#source: start.s
+#as: --x32 -mx86-used-note=no
+#ld: -m elf32_x86_64 -z ibt
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: IBT
diff --git a/ld/testsuite/ld-x86-64/pr26711-1.d b/ld/testsuite/ld-x86-64/pr26711-1.d
new file mode 100644 (file)
index 0000000..d8e3cbf
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr26711.s
+#source: start.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=no
+#ld: -m elf_x86_64 -z ibt
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: IBT
diff --git a/ld/testsuite/ld-x86-64/pr26711-2-x32.d b/ld/testsuite/ld-x86-64/pr26711-2-x32.d
new file mode 100644 (file)
index 0000000..9822f8d
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr26711.s
+#source: start.s
+#as: --x32 -mx86-used-note=no
+#ld: -m elf32_x86_64 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/pr26711-2.d b/ld/testsuite/ld-x86-64/pr26711-2.d
new file mode 100644 (file)
index 0000000..e24cfbf
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr26711.s
+#source: start.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=no
+#ld: -m elf_x86_64 -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: SHSTK
diff --git a/ld/testsuite/ld-x86-64/pr26711-3-x32.d b/ld/testsuite/ld-x86-64/pr26711-3-x32.d
new file mode 100644 (file)
index 0000000..0661c7d
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr26711.s
+#source: start.s
+#as: --x32 -mx86-used-note=no
+#ld: -m elf32_x86_64 -z ibt -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: IBT, SHSTK
diff --git a/ld/testsuite/ld-x86-64/pr26711-3.d b/ld/testsuite/ld-x86-64/pr26711-3.d
new file mode 100644 (file)
index 0000000..87bc3cc
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr26711.s
+#source: start.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=no
+#ld: -m elf_x86_64 -z ibt -z shstk
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature: IBT, SHSTK
diff --git a/ld/testsuite/ld-x86-64/pr26711.s b/ld/testsuite/ld-x86-64/pr26711.s
new file mode 100644 (file)
index 0000000..8fa185d
--- /dev/null
@@ -0,0 +1,33 @@
+       .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 0xc0001002        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x30
+4:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+5:
+
+       .text
+       .globl  foo
+       .type   foo, @function
+foo:
+       ret
index 2c2551fd62e7f24336e40c93c85a35963b2818e0..59cad54a7996cd99c2ef9f78dd9cc86c1c6a3c52 100644 (file)
@@ -432,6 +432,12 @@ run_dump_test "pr25416-3"
 run_dump_test "pr25416-4"
 run_dump_test "pr26018"
 run_dump_test "pr26263"
+run_dump_test "pr26711-1"
+run_dump_test "pr26711-1-x32"
+run_dump_test "pr26711-2"
+run_dump_test "pr26711-2-x32"
+run_dump_test "pr26711-3"
+run_dump_test "pr26711-3-x32"
 
 if ![istarget "x86_64-*-linux*"] {
     return