x86: Properly add X86_ISA_1_NEEDED property
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 11 Aug 2018 13:41:33 +0000 (06:41 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 11 Aug 2018 13:41:33 +0000 (06:41 -0700)
Existing properties may be removed during property merging.  We avoid
adding X86_ISA_1_NEEDED property only if existing properties won't be
removed.

bfd/

PR ld/23428
* elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Don't
add X86_ISA_1_NEEDED property only if existing properties won't
be removed.

ld/

PR ld/23428
* testsuite/ld-elf/dummy.s: New file.
* testsuite/ld-elf/linux-x86.S: Add X86_FEATURE_1_AND property.
* testsuite/ld-elf/linux-x86.exp: Add dummy.s to pr23428.

bfd/ChangeLog
bfd/elfxx-x86.c
ld/ChangeLog
ld/testsuite/ld-elf/dummy.s [new file with mode: 0644]
ld/testsuite/ld-elf/linux-x86.S
ld/testsuite/ld-elf/linux-x86.exp

index 8c2c6cc..8d8f0a6 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/23428
+       * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Don't
+       add X86_ISA_1_NEEDED property only if existing properties won't
+       be removed.
+
 2018-08-11  Alan Modra  <amodra@gmail.com>
 
        * reloc.c (bfd_get_reloc_size): Sort switch.
index 7ccfd25..2d8f7b6 100644 (file)
@@ -2588,7 +2588,6 @@ _bfd_x86_elf_link_setup_gnu_properties
          prop->pr_kind = property_number;
        }
       else if (has_text
-              && elf_properties (ebfd) == NULL
               && elf_tdata (info->output_bfd)->o->build_id.sec == NULL
               && !htab->elf.dynamic_sections_created
               && !info->traditional_format
@@ -2598,11 +2597,28 @@ _bfd_x86_elf_link_setup_gnu_properties
          /* If the separate code program header is needed, make sure
             that the first read-only PT_LOAD segment has no code by
             adding a GNU_PROPERTY_X86_ISA_1_NEEDED note.  */
-         prop = _bfd_elf_get_property (ebfd,
-                                       GNU_PROPERTY_X86_ISA_1_NEEDED,
-                                       4);
-         prop->u.number = GNU_PROPERTY_X86_ISA_1_486;
-         prop->pr_kind = property_number;
+         elf_property_list *list;
+         bfd_boolean need_property = TRUE;
+
+         for (list = elf_properties (ebfd); list; list = list->next)
+           switch (list->property.pr_type)
+             {
+             case GNU_PROPERTY_STACK_SIZE:
+             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
+             case GNU_PROPERTY_X86_ISA_1_NEEDED:
+               /* These properties won't be removed during merging.  */
+               need_property = FALSE;
+               break;
+             }
+
+         if (need_property)
+           {
+             prop = _bfd_elf_get_property (ebfd,
+                                           GNU_PROPERTY_X86_ISA_1_NEEDED,
+                                           4);
+             prop->u.number = GNU_PROPERTY_X86_ISA_1_486;
+             prop->pr_kind = property_number;
+           }
        }
 
       /* Create the GNU property note section if needed.  */
index 78d371e..79b8912 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/23428
+       * testsuite/ld-elf/dummy.s: New file.
+       * testsuite/ld-elf/linux-x86.S: Add X86_FEATURE_1_AND property.
+       * testsuite/ld-elf/linux-x86.exp: Add dummy.s to pr23428.
+
 2018-08-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/23486
diff --git a/ld/testsuite/ld-elf/dummy.s b/ld/testsuite/ld-elf/dummy.s
new file mode 100644 (file)
index 0000000..403f980
--- /dev/null
@@ -0,0 +1 @@
+# Dummy
index bdf40c6..d94abc1 100644 (file)
@@ -61,3 +61,31 @@ syscall:
        ret                     /* Return to caller.  */
        .size syscall, .-syscall
        .section .note.GNU-stack,"",@progbits
+
+       .section ".note.gnu.property", "a"
+#ifdef __LP64__
+       .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 __LP64__
+       .p2align 3
+#else
+       .p2align 2
+#endif
+2:     .long 0xc0000002        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x2
+4:
+#ifdef __LP64__
+       .p2align 3
+#else
+       .p2align 2
+#endif
+5:
index 36217c6..f6f5a80 100644 (file)
@@ -37,7 +37,7 @@ run_ld_link_exec_tests [list \
        "Run PR ld/23428 test" \
        "--no-dynamic-linker -z separate-code" \
        "" \
-       { linux-x86.S pr23428.c } \
+       { linux-x86.S pr23428.c dummy.s } \
        "pr23428" \
        "pass.out" \
        "$NOPIE_CFLAGS -fno-asynchronous-unwind-tables" \