This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Convert .note.gnu.property section between ELF32 and ELF64


On Wed, Aug 8, 2018 at 8:21 PM, Alan Modra <amodra@gmail.com> wrote:
> On Wed, Aug 08, 2018 at 07:24:33PM -0700, H.J. Lu wrote:
>> --- a/bfd/bfd.c
>> +++ b/bfd/bfd.c
>> @@ -2483,6 +2483,10 @@ bfd_convert_section_size (bfd *ibfd, sec_ptr isec, bfd *obfd,
>>        == get_elf_backend_data (obfd)->s->elfclass)
>>      return size;
>>
>> +  /* Convert GNU property size.  */
>> +  if (CONST_STRNEQ (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME))
>> +    return _bfd_elf_convert_gnu_property_size (ibfd, obfd);
>> +
>>    /* Do nothing if the input section isn't a SHF_COMPRESSED section. */
>>    hdr_size = bfd_get_compression_header_size (ibfd, isec);
>>    if (hdr_size == 0)
>
> I suspect this conversion shouldn't depend on the earlier
> BFD_DECOMPRESS test, and similarly for convert_section_contents.
> OK with that fixed.
>

You are right.  I am checking in this updated patch with a new testcase.

Thanks.


-- 
H.J.
From 1bdc1d94bf3bb10e87988cfdcf6d2dfc8ed87a90 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Wed, 8 Aug 2018 12:58:26 -0700
Subject: [PATCH] Convert .note.gnu.property section between ELF32 and ELF64

.note.gnu.property section has different alignments and section
sizes for 32-bit and 64-bit ELF binaries.  This patch updated
bfd_convert_section_size and bfd_convert_section_contents to
properly convert .note.gnu.property section between 32-bit and
64-bit ELF binaries.

bfd/

	PR binutils/23494
	* bfd.c (bfd_convert_section_size): Check BFD_DECOMPRESS after
	calling _bfd_elf_convert_gnu_property_size to convert
	.note.gnu.property section size.
	(bfd_convert_section_contents): Check BFD_DECOMPRESS after
	calling _bfd_elf_convert_gnu_properties to convert
	.note.gnu.property section.
	* elf-bfd.h (_bfd_elf_convert_gnu_property_size): New prototype.
	(_bfd_elf_convert_gnu_properties): Likewise.
	* elf-properties.c (elf_get_gnu_property_section_size): New
	function.
	(elf_write_gnu_properties): Likewise.
	(_bfd_elf_convert_gnu_property_size): Likewise.
	(_bfd_elf_convert_gnu_properties): Likewise.
	(_bfd_elf_link_setup_gnu_properties): Use
	elf_get_gnu_property_section_size and elf_write_gnu_properties.

binutils/

	PR binutils/23494
	* testsuite/binutils-all/x86-64/pr23494a-x32.d: New file.
	* testsuite/binutils-all/x86-64/pr23494a.d: Likewise.
	* testsuite/binutils-all/x86-64/pr23494a.s: Likewise.
	* testsuite/binutils-all/x86-64/pr23494b-x32.d: Likewise.
	* testsuite/binutils-all/x86-64/pr23494b.d: Likewise.
	* testsuite/binutils-all/x86-64/pr23494b.s: Likewise.
	* testsuite/binutils-all/x86-64/pr23494c-x32.d: Likewise.
	* testsuite/binutils-all/x86-64/pr23494c.d: Likewise.
	* testsuite/binutils-all/x86-64/pr23494d-x32.d: Likewise.
	* testsuite/binutils-all/x86-64/pr23494d.d: Likewise.
---
 bfd/bfd.c                                     |  25 +-
 bfd/elf-bfd.h                                 |   4 +
 bfd/elf-properties.c                          | 215 ++++++++++++------
 .../binutils-all/x86-64/pr23494a-x32.d        |  11 +
 .../testsuite/binutils-all/x86-64/pr23494a.d  |  11 +
 .../testsuite/binutils-all/x86-64/pr23494a.s  |  92 ++++++++
 .../binutils-all/x86-64/pr23494b-x32.d        |   5 +
 .../testsuite/binutils-all/x86-64/pr23494b.d  |   5 +
 .../testsuite/binutils-all/x86-64/pr23494b.s  |  30 +++
 .../binutils-all/x86-64/pr23494c-x32.d        |  10 +
 .../testsuite/binutils-all/x86-64/pr23494c.d  |  10 +
 .../binutils-all/x86-64/pr23494d-x32.d        |  11 +
 .../testsuite/binutils-all/x86-64/pr23494d.d  |  11 +
 13 files changed, 365 insertions(+), 75 deletions(-)
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494a-x32.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494a.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494a.s
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494b-x32.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494b.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494b.s
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494c-x32.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494c.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494d-x32.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494d.d

diff --git a/bfd/bfd.c b/bfd/bfd.c
index 851710401e..15becd7ae8 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -2469,10 +2469,6 @@ bfd_convert_section_size (bfd *ibfd, sec_ptr isec, bfd *obfd,
 {
   bfd_size_type hdr_size;
 
-  /* Do nothing if input file will be decompressed.  */
-  if ((ibfd->flags & BFD_DECOMPRESS))
-    return size;
-
   /* Do nothing if either input or output aren't ELF.  */
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
@@ -2483,6 +2479,14 @@ bfd_convert_section_size (bfd *ibfd, sec_ptr isec, bfd *obfd,
       == get_elf_backend_data (obfd)->s->elfclass)
     return size;
 
+  /* Convert GNU property size.  */
+  if (CONST_STRNEQ (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME))
+    return _bfd_elf_convert_gnu_property_size (ibfd, obfd);
+
+  /* Do nothing if input file will be decompressed.  */
+  if ((ibfd->flags & BFD_DECOMPRESS))
+    return size;
+
   /* Do nothing if the input section isn't a SHF_COMPRESSED section. */
   hdr_size = bfd_get_compression_header_size (ibfd, isec);
   if (hdr_size == 0)
@@ -2523,10 +2527,6 @@ bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd,
   Elf_Internal_Chdr chdr;
   bfd_boolean use_memmove;
 
-  /* Do nothing if input file will be decompressed.  */
-  if ((ibfd->flags & BFD_DECOMPRESS))
-    return TRUE;
-
   /* Do nothing if either input or output aren't ELF.  */
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
@@ -2537,6 +2537,15 @@ bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd,
       == get_elf_backend_data (obfd)->s->elfclass)
     return TRUE;
 
+  /* Convert GNU properties.  */
+  if (CONST_STRNEQ (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME))
+    return _bfd_elf_convert_gnu_properties (ibfd, isec, obfd, ptr,
+					    ptr_size);
+
+  /* Do nothing if input file will be decompressed.  */
+  if ((ibfd->flags & BFD_DECOMPRESS))
+    return TRUE;
+
   /* Do nothing if the input section isn't a SHF_COMPRESSED section. */
   ihdr_size = bfd_get_compression_header_size (ibfd, isec);
   if (ihdr_size == 0)
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index ba1b495a09..530679f9c8 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2705,6 +2705,10 @@ extern elf_property * _bfd_elf_get_property
   (bfd *, unsigned int, unsigned int);
 extern bfd *_bfd_elf_link_setup_gnu_properties
   (struct bfd_link_info *);
+extern bfd_size_type _bfd_elf_convert_gnu_property_size
+  (bfd *, bfd *);
+extern bfd_boolean _bfd_elf_convert_gnu_properties
+  (bfd *, asection *, bfd *, bfd_byte **, bfd_size_type *);
 
 /* The linker may need to keep track of the number of relocs that it
    decides to copy as dynamic relocs in check_relocs for each symbol.
diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c
index 50c0e9d703..0ac055534d 100644
--- a/bfd/elf-properties.c
+++ b/bfd/elf-properties.c
@@ -304,6 +304,94 @@ elf_merge_gnu_property_list (struct bfd_link_info *info, bfd *abfd,
       }
 }
 
+/* Get GNU property section size.  */
+
+static bfd_size_type
+elf_get_gnu_property_section_size (elf_property_list *list,
+				   unsigned int align_size)
+{
+  bfd_size_type size;
+  unsigned int descsz;
+
+  /* Compute the output section size.  */
+  descsz = offsetof (Elf_External_Note, name[sizeof "GNU"]);
+  descsz = (descsz + 3) & -(unsigned int) 4;
+  size = descsz;
+  for (; list != NULL; list = list->next)
+    {
+      /* There are 4 byte type + 4 byte datasz for each property.  */
+      size += 4 + 4 + list->property.pr_datasz;
+      /* Align each property.  */
+      size = (size + (align_size - 1)) & ~(align_size - 1);
+    }
+
+  return size;
+}
+
+/* Write GNU properties.  */
+
+static void
+elf_write_gnu_properties (bfd *abfd, bfd_byte *contents,
+			  elf_property_list *list, unsigned int size,
+			  unsigned int align_size)
+{
+  unsigned int descsz;
+  Elf_External_Note *e_note;
+
+  e_note = (Elf_External_Note *) contents;
+  descsz = offsetof (Elf_External_Note, name[sizeof "GNU"]);
+  descsz = (descsz + 3) & -(unsigned int) 4;
+  bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
+  bfd_h_put_32 (abfd, size - descsz, &e_note->descsz);
+  bfd_h_put_32 (abfd, NT_GNU_PROPERTY_TYPE_0, &e_note->type);
+  memcpy (e_note->name, "GNU", sizeof "GNU");
+
+  size = descsz;
+  for (; list != NULL; list = list->next)
+    {
+      /* There are 4 byte type + 4 byte datasz for each property.  */
+      bfd_h_put_32 (abfd, list->property.pr_type,
+		    contents + size);
+      bfd_h_put_32 (abfd, list->property.pr_datasz,
+		    contents + size + 4);
+      size += 4 + 4;
+
+      /* Write out property value.  */
+      switch (list->property.pr_kind)
+	{
+	case property_number:
+	  switch (list->property.pr_datasz)
+	    {
+	    default:
+	      /* Never should happen.  */
+	      abort ();
+
+	    case 0:
+	      break;
+
+	    case 4:
+	      bfd_h_put_32 (abfd, list->property.u.number,
+			    contents + size);
+	      break;
+
+	    case 8:
+	      bfd_h_put_64 (abfd, list->property.u.number,
+			    contents + size);
+	      break;
+	    }
+	  break;
+
+	default:
+	  /* Never should happen.  */
+	  abort ();
+	}
+      size += list->property.pr_datasz;
+
+      /* Align each property.  */
+      size = (size + (align_size - 1)) & ~ (align_size - 1);
+    }
+}
+
 /* Set up GNU properties.  Return the first relocatable ELF input with
    GNU properties if found.  Otherwise, return NULL.  */
 
@@ -390,10 +478,8 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
      always sorted by type even if input GNU properties aren't sorted.  */
   if (first_pbfd != NULL)
     {
-      unsigned int size;
-      unsigned int descsz;
+      bfd_size_type size;
       bfd_byte *contents;
-      Elf_External_Note *e_note;
       unsigned int align_size = bed->s->elfclass == ELFCLASS64 ? 8 : 4;
 
       sec = bfd_get_section_by_name (first_pbfd,
@@ -427,75 +513,15 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
 	}
 
       /* Compute the section size.  */
-      descsz = offsetof (Elf_External_Note, name[sizeof "GNU"]);
-      descsz = (descsz + 3) & -(unsigned int) 4;
-      size = descsz;
-      for (list = elf_properties (first_pbfd);
-	   list != NULL;
-	   list = list->next)
-	{
-	  /* There are 4 byte type + 4 byte datasz for each property.  */
-	  size += 4 + 4 + list->property.pr_datasz;
-	  /* Align each property.  */
-	  size = (size + (align_size - 1)) & ~(align_size - 1);
-	}
+      list = elf_properties (first_pbfd);
+      size = elf_get_gnu_property_section_size (list, align_size);
 
       /* Update .note.gnu.property section now.  */
       sec->size = size;
       contents = (bfd_byte *) bfd_zalloc (first_pbfd, size);
 
-      e_note = (Elf_External_Note *) contents;
-      bfd_h_put_32 (first_pbfd, sizeof "GNU", &e_note->namesz);
-      bfd_h_put_32 (first_pbfd, size - descsz, &e_note->descsz);
-      bfd_h_put_32 (first_pbfd, NT_GNU_PROPERTY_TYPE_0, &e_note->type);
-      memcpy (e_note->name, "GNU", sizeof "GNU");
-
-      size = descsz;
-      for (list = elf_properties (first_pbfd);
-	   list != NULL;
-	   list = list->next)
-	{
-	  /* There are 4 byte type + 4 byte datasz for each property.  */
-	  bfd_h_put_32 (first_pbfd, list->property.pr_type,
-			contents + size);
-	  bfd_h_put_32 (first_pbfd, list->property.pr_datasz,
-			contents + size + 4);
-	  size += 4 + 4;
-
-	  /* Write out property value.  */
-	  switch (list->property.pr_kind)
-	    {
-	    case property_number:
-	      switch (list->property.pr_datasz)
-		{
-		default:
-		  /* Never should happen.  */
-		  abort ();
-
-		case 0:
-		  break;
-
-		case 4:
-		  bfd_h_put_32 (first_pbfd, list->property.u.number,
-				contents + size);
-		  break;
-
-		case 8:
-		  bfd_h_put_64 (first_pbfd, list->property.u.number,
-				contents + size);
-		  break;
-		}
-	      break;
-
-	    default:
-	      /* Never should happen.  */
-	      abort ();
-	    }
-	  size += list->property.pr_datasz;
-
-	  /* Align each property.  */
-	  size = (size + (align_size - 1)) & ~ (align_size - 1);
-	}
+      elf_write_gnu_properties (first_pbfd, contents, list, size,
+				align_size);
 
       /* Cache the section contents for elf_link_input_bfd.  */
       elf_section_data (sec)->this_hdr.contents = contents;
@@ -508,3 +534,58 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
 
   return first_pbfd;
 }
+
+/* Convert GNU property size.  */
+
+bfd_size_type
+_bfd_elf_convert_gnu_property_size (bfd *ibfd, bfd *obfd)
+{
+  unsigned int align_size;
+  const struct elf_backend_data *bed;
+  elf_property_list *list = elf_properties (ibfd);
+
+  bed = get_elf_backend_data (obfd);
+  align_size = bed->s->elfclass == ELFCLASS64 ? 8 : 4;
+
+  /* Get the output .note.gnu.property section size.  */
+  return elf_get_gnu_property_section_size (list, align_size);
+}
+
+/* Convert GNU properties.  */
+
+bfd_boolean
+_bfd_elf_convert_gnu_properties (bfd *ibfd, asection *isec,
+				 bfd *obfd, bfd_byte **ptr,
+				 bfd_size_type *ptr_size)
+{
+  unsigned int size;
+  bfd_byte *contents;
+  unsigned int align_shift;
+  const struct elf_backend_data *bed;
+  elf_property_list *list = elf_properties (ibfd);
+
+  bed = get_elf_backend_data (obfd);
+  align_shift = bed->s->elfclass == ELFCLASS64 ? 3 : 2;
+
+  /* Get the output .note.gnu.property section size.  */
+  size = bfd_get_section_size (isec->output_section);
+
+  /* Update the output .note.gnu.property section alignment.  */
+  bfd_set_section_alignment (obfd, isec->output_section, align_shift);
+
+  if (size > bfd_get_section_size (isec))
+    {
+      contents = (bfd_byte *) bfd_malloc (size);
+      free (*ptr);
+      *ptr = contents;
+    }
+  else
+    contents = *ptr;
+
+  *ptr_size = size;
+
+  /* Generate the output .note.gnu.property section.  */
+  elf_write_gnu_properties (ibfd, contents, list, size, 1 << align_shift);
+
+  return TRUE;
+}
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494a-x32.d b/binutils/testsuite/binutils-all/x86-64/pr23494a-x32.d
new file mode 100644
index 0000000000..6171e3c80c
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494a-x32.d
@@ -0,0 +1,11 @@
+#source: pr23494a.s
+#PROG: objcopy
+#as: --x32
+#objcopy: -O elf64-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: SSE3, SSE4_1
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494a.d b/binutils/testsuite/binutils-all/x86-64/pr23494a.d
new file mode 100644
index 0000000000..5e8b0b61c7
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494a.d
@@ -0,0 +1,11 @@
+#source: pr23494a.s
+#PROG: objcopy
+#as: --64 -defsym __64_bit__=1
+#objcopy: -O 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: SSE3, SSE4_1
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494a.s b/binutils/testsuite/binutils-all/x86-64/pr23494a.s
new file mode 100644
index 0000000000..77185bdc1a
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494a.s
@@ -0,0 +1,92 @@
+	.section ".note.gnu.property", "a"
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	.long 1f - 0f		/* name length.  */
+	.long 3f - 1f		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.long 5			/* note type.  */
+0:
+	.asciz "GNU"		/* vendor name.  */
+1:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	/* GNU_PROPERTY_X86_ISA_1_USED */
+	.long 0xc0000000	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0xa
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
+
+	.section ".note.gnu.property", "a"
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	.long 1f - 0f		/* name length.  */
+	.long 3f - 1f		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.long 5			/* note type.  */
+0:
+	.asciz "GNU"		/* vendor name.  */
+1:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	/* GNU_PROPERTY_X86_ISA_1_NEEDED */
+	.long 0xc0000001	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0xa0
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
+
+	.section ".note.gnu.property", "a"
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	.long 1f - 0f		/* name length.  */
+	.long 3f - 1f		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.long 5			/* note type.  */
+0:
+	.asciz "GNU"		/* vendor name.  */
+1:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	/* GNU_PROPERTY_X86_ISA_1_USED */
+	.long 0xc0000000	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0xa0
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494b-x32.d b/binutils/testsuite/binutils-all/x86-64/pr23494b-x32.d
new file mode 100644
index 0000000000..e0b351b51d
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494b-x32.d
@@ -0,0 +1,5 @@
+#source: pr23494a.s
+#PROG: objcopy
+#as: --x32
+#objcopy: -O elf64-x86-64 -R .note.gnu.property
+#readelf: -n
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494b.d b/binutils/testsuite/binutils-all/x86-64/pr23494b.d
new file mode 100644
index 0000000000..69c5340710
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494b.d
@@ -0,0 +1,5 @@
+#source: pr23494a.s
+#PROG: objcopy
+#as: --64 -defsym __64_bit__=1
+#objcopy: -O elf32-x86-64 -R .note.gnu.property
+#readelf: -n
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494b.s b/binutils/testsuite/binutils-all/x86-64/pr23494b.s
new file mode 100644
index 0000000000..239477b082
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494b.s
@@ -0,0 +1,30 @@
+	.section ".note.gnu.property", "a"
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	.long 1f - 0f		/* name length.  */
+	.long 3f - 1f		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.long 5			/* note type.  */
+0:
+	.asciz "GNU"		/* vendor name.  */
+1:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	/* GNU_PROPERTY_X86_ISA_1_USED */
+	.long 0xc0000000	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0xa
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494c-x32.d b/binutils/testsuite/binutils-all/x86-64/pr23494c-x32.d
new file mode 100644
index 0000000000..3f213dcd91
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494c-x32.d
@@ -0,0 +1,10 @@
+#source: pr23494b.s
+#PROG: objcopy
+#as: --x32
+#objcopy: -O elf64-x86-64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size	Description
+  GNU                  0x00000010	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: 586, SSE
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494c.d b/binutils/testsuite/binutils-all/x86-64/pr23494c.d
new file mode 100644
index 0000000000..62500a8382
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494c.d
@@ -0,0 +1,10 @@
+#source: pr23494b.s
+#PROG: objcopy
+#as: --64 -defsym __64_bit__=1
+#objcopy: -O 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 ISA used: 586, SSE
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494d-x32.d b/binutils/testsuite/binutils-all/x86-64/pr23494d-x32.d
new file mode 100644
index 0000000000..106e6c05cb
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494d-x32.d
@@ -0,0 +1,11 @@
+#PROG: objcopy
+#source: pr23494a.s
+#as: --x32
+#objcopy: -O elf64-x86-64 --decompress-debug-sections
+#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: SSE3, SSE4_1
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494d.d b/binutils/testsuite/binutils-all/x86-64/pr23494d.d
new file mode 100644
index 0000000000..bcbcbc5c1f
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494d.d
@@ -0,0 +1,11 @@
+#PROG: objcopy
+#source: pr23494a.s
+#as: --64 -defsym __64_bit__=1
+#objcopy: -O elf32-x86-64 --decompress-debug-sections
+#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: SSE3, SSE4_1
-- 
2.17.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]