Blob Blame History Raw
diff -rup binutils.orig/bfd/elf-bfd.h binutils-2.30/bfd/elf-bfd.h
--- binutils.orig/bfd/elf-bfd.h	2020-04-07 11:32:17.269776457 +0100
+++ binutils-2.30/bfd/elf-bfd.h	2020-04-07 13:34:03.897784103 +0100
@@ -1467,12 +1467,16 @@ struct elf_backend_data
 						  unsigned int);
 
   /* Merge GNU properties.  Return TRUE if property is updated.  */
-  bfd_boolean (*merge_gnu_properties) (struct bfd_link_info *, bfd *,
+  bfd_boolean (*merge_gnu_properties) (struct bfd_link_info *, bfd *, bfd *,
 				       elf_property *, elf_property *);
 
   /* Set up GNU properties.  */
   bfd *(*setup_gnu_properties) (struct bfd_link_info *);
 
+  /* Fix up GNU properties.  */
+  void (*fixup_gnu_properties) (struct bfd_link_info *,
+				elf_property_list **);
+
   /* Encoding used for compact EH tables.  */
   int (*compact_eh_encoding) (struct bfd_link_info *);
 
@@ -2673,6 +2677,10 @@ extern elf_property * _bfd_elf_get_prope
   (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 -rup binutils.orig/bfd/elf-properties.c binutils-2.30/bfd/elf-properties.c
--- binutils.orig/bfd/elf-properties.c	2020-04-07 11:32:17.280776377 +0100
+++ binutils-2.30/bfd/elf-properties.c	2020-04-07 13:34:03.899784089 +0100
@@ -198,7 +198,7 @@ next:
    with ABFD.  */
 
 static bfd_boolean
-elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd,
+elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd, bfd *bbfd,
 			  elf_property *aprop, elf_property *bprop)
 {
   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
@@ -207,7 +207,7 @@ elf_merge_gnu_properties (struct bfd_lin
   if (bed->merge_gnu_properties != NULL
       && pr_type >= GNU_PROPERTY_LOPROC
       && pr_type < GNU_PROPERTY_LOUSER)
-    return bed->merge_gnu_properties (info, abfd, aprop, bprop);
+    return bed->merge_gnu_properties (info, abfd, bbfd, aprop, bprop);
 
   switch (pr_type)
     {
@@ -241,7 +241,7 @@ elf_merge_gnu_properties (struct bfd_lin
 
 static elf_property *
 elf_find_and_remove_property (elf_property_list **listp,
-			      unsigned int type)
+			      unsigned int type, bfd_boolean remove)
 {
   elf_property_list *list;
 
@@ -250,7 +250,8 @@ elf_find_and_remove_property (elf_proper
       if (type == list->property.pr_type)
 	{
 	  /* Remove this property.  */
-	  *listp = list->next;
+	  if (remove)
+	    *listp = list->next;
 	  return &list->property;
 	}
       else if (type < list->property.pr_type)
@@ -261,47 +262,241 @@ elf_find_and_remove_property (elf_proper
   return NULL;
 }
 
-/* Merge GNU property list *LISTP with ABFD.  */
+/* Merge GNU property list *LISTP in ABFD with FIRST_PBFD.  */
 
 static void
-elf_merge_gnu_property_list (struct bfd_link_info *info, bfd *abfd,
-			     elf_property_list **listp)
+elf_merge_gnu_property_list (struct bfd_link_info *info, bfd *first_pbfd,
+			     bfd *abfd, elf_property_list **listp)
 {
   elf_property_list *p, **lastp;
   elf_property *pr;
+  bfd_boolean number_p;
+  bfd_vma number = 0;
 
-  /* Merge each GNU property in ABFD with the one on *LISTP.  */
-  lastp = &elf_properties (abfd);
+  /* Merge each GNU property in FIRST_PBFD with the one on *LISTP.  */
+  lastp = &elf_properties (first_pbfd);
   for (p = *lastp; p; p = p->next)
+    if (p->property.pr_kind != property_remove)
+      {
+	if (p->property.pr_kind == property_number)
+	  {
+	    number_p = TRUE;
+	    number = p->property.u.number;
+	  }
+	else
+	  number_p = FALSE;
+	pr = elf_find_and_remove_property (listp, p->property.pr_type,
+					   TRUE);
+	/* Pass NULL to elf_merge_gnu_properties for the property which
+	   isn't on *LISTP.  */
+	elf_merge_gnu_properties (info, first_pbfd, abfd, &p->property, pr);
+	if (p->property.pr_kind == property_remove)
+	  {
+	    if (number_p)
+	      {
+		if (pr != NULL)
+		  info->callbacks->minfo
+		    (_("Removed property %W to merge %pB (0x%v) "
+		       "and %pB (0x%v)\n"),
+		     (bfd_vma) p->property.pr_type, first_pbfd,
+		     number, abfd, pr->u.number);
+		else
+		  info->callbacks->minfo
+		    (_("Removed property %W to merge %pB (0x%v) "
+		       "and %pB (not found)\n"),
+		     (bfd_vma) p->property.pr_type, first_pbfd,
+		     number, abfd);
+	      }
+	    else
+	      {
+		if (pr != NULL)
+		  info->callbacks->minfo
+		    (_("Removed property %W to merge %pB and %pB\n"),
+		     (bfd_vma) p->property.pr_type, first_pbfd, abfd);
+		else
+		  info->callbacks->minfo
+		    (_("Removed property %W to merge %pB and %pB "
+		       "(not found)\n"),
+		     (bfd_vma) p->property.pr_type, first_pbfd, abfd);
+	      }
+
+	    /* Remove this property.  */
+	    *lastp = p->next;
+	    continue;
+	  }
+	else if (number_p)
+	  {
+	    if (pr != NULL)
+	      {
+		if (p->property.u.number != number
+		    || p->property.u.number != pr->u.number)
+		  info->callbacks->minfo
+		    (_("Updated property %W (0x%v) to merge %pB (0x%v) "
+		       "and %pB (0x%v)\n"),
+		     (bfd_vma) p->property.pr_type, p->property.u.number,
+		     first_pbfd, number, abfd, pr->u.number);
+	      }
+	    else
+	      {
+		if (p->property.u.number != number)
+		  info->callbacks->minfo
+		    (_("Updated property %W (%v) to merge %pB (0x%v) "
+		       "and %pB (not found)\n"),
+		     (bfd_vma) p->property.pr_type, p->property.u.number,
+		     first_pbfd, number, abfd);
+	      }
+	  }
+	lastp = &p->next;
+      }
+
+  /* Merge the remaining properties on *LISTP with FIRST_PBFD.  */
+  for (p = *listp; p != NULL; p = p->next)
     {
-      pr = elf_find_and_remove_property (listp, p->property.pr_type);
-      /* Pass NULL to elf_merge_gnu_properties for the property which
-	 isn't on *LISTP.  */
-      elf_merge_gnu_properties (info, abfd, &p->property, pr);
-      if (p->property.pr_kind == property_remove)
+      if (p->property.pr_kind == property_number)
 	{
-	  /* Remove this property.  */
-	  *lastp = p->next;
-	  continue;
+	  number_p = TRUE;
+	  number = p->property.u.number;
+	}
+      else
+	number_p = FALSE;
+
+      if (elf_merge_gnu_properties (info, first_pbfd, abfd, NULL, &p->property))
+	{
+	  if (p->property.pr_type == GNU_PROPERTY_NO_COPY_ON_PROTECTED)
+	    elf_has_no_copy_on_protected (first_pbfd) = TRUE;
+
+	  pr = _bfd_elf_get_property (first_pbfd, p->property.pr_type,
+				      p->property.pr_datasz);
+	  /* It must be a new property.  */
+	  if (pr->pr_kind != property_unknown)
+	    abort ();
+	  /* Add a new property.  */
+	  *pr = p->property;
+	}
+      else
+	{
+	  pr = elf_find_and_remove_property (&elf_properties (first_pbfd),
+					     p->property.pr_type,
+					     FALSE);
+	  if (pr == NULL)
+	    {
+	      if (number_p)
+		info->callbacks->minfo
+		  (_("Removed property %W to merge %pB (not found) and "
+		     "%pB (0x%v)\n"),
+		   (bfd_vma) p->property.pr_type, first_pbfd, abfd,
+		   number);
+	      else
+		info->callbacks->minfo
+		  (_("Removed property %W to merge %pB and %pB\n"),
+		   (bfd_vma) p->property.pr_type, first_pbfd, abfd);
+	    }
+	  else if (pr->pr_kind != property_remove)
+	    abort ();
 	}
-      lastp = &p->next;
     }
+}
 
-  /* Merge the remaining properties on *LISTP with ABFD.  */
-  for (p = *listp; p != NULL; p = p->next)
-    if (elf_merge_gnu_properties (info, abfd, NULL, &p->property))
-      {
-	if (p->property.pr_type == GNU_PROPERTY_NO_COPY_ON_PROTECTED)
-	  elf_has_no_copy_on_protected (abfd) = TRUE;
+/* 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)
+    {
+      unsigned int datasz;
+      /* Check if this property should be skipped.  */
+      if (list->property.pr_kind == property_remove)
+	continue;
+      /* There are 4 byte type + 4 byte datasz for each property.  */
+      if (list->property.pr_type == GNU_PROPERTY_STACK_SIZE)
+	datasz = align_size;
+      else
+	datasz = list->property.pr_datasz;
+      size += 4 + 4 + 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;
+  unsigned int datasz;
+  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)
+    {
+      /* Check if this property should be skipped.  */
+      if (list->property.pr_kind == property_remove)
+	continue;
+      /* There are 4 byte type + 4 byte datasz for each property.  */
+      if (list->property.pr_type == GNU_PROPERTY_STACK_SIZE)
+	datasz = align_size;
+      else
+	datasz = list->property.pr_datasz;
+      bfd_h_put_32 (abfd, list->property.pr_type, contents + size);
+      bfd_h_put_32 (abfd, datasz, contents + size + 4);
+      size += 4 + 4;
+
+      /* Write out property value.  */
+      switch (list->property.pr_kind)
+	{
+	case property_number:
+	  switch (datasz)
+	    {
+	    default:
+	      /* Never should happen.  */
+	      abort ();
+
+	    case 0:
+	      break;
+
+	    case 4:
+	      bfd_h_put_32 (abfd, list->property.u.number,
+			    contents + size);
+	      break;
 
-	pr = _bfd_elf_get_property (abfd, p->property.pr_type,
-				    p->property.pr_datasz);
-	/* It must be a new property.  */
-	if (pr->pr_kind != property_unknown)
+	    case 8:
+	      bfd_h_put_64 (abfd, list->property.u.number,
+			    contents + size);
+	      break;
+	    }
+	  break;
+
+	default:
+	  /* Never should happen.  */
 	  abort ();
-	/* Add a new property.  */
-	*pr = p->property;
-      }
+	}
+      size += datasz;
+
+      /* Align each property.  */
+      size = (size + (align_size - 1)) & ~ (align_size - 1);
+    }
 }
 
 /* Set up GNU properties.  Return the first relocatable ELF input with
@@ -349,8 +544,13 @@ _bfd_elf_link_setup_gnu_properties (stru
     return NULL;
 
   /* Merge .note.gnu.property sections.  */
+  info->callbacks->minfo (_("\n"));
+  info->callbacks->minfo (_("Merging program properties\n"));
+  info->callbacks->minfo (_("\n"));
+
   for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
-    if (abfd != first_pbfd && (abfd->flags & DYNAMIC) == 0)
+    if (abfd != first_pbfd
+	&& (abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED)) == 0)
       {
 	elf_property_list *null_ptr = NULL;
 	elf_property_list **listp = &null_ptr;
@@ -374,7 +574,7 @@ _bfd_elf_link_setup_gnu_properties (stru
 	   when all properties are from ELF objects with different
 	   machine code or class.  */
 	if (first_pbfd != NULL)
-	  elf_merge_gnu_property_list (info, first_pbfd, listp);
+	  elf_merge_gnu_property_list (info, first_pbfd, abfd, listp);
 
 	if (list != NULL)
 	  {
@@ -390,11 +590,9 @@ _bfd_elf_link_setup_gnu_properties (stru
      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;
+      unsigned int align_size = elfclass == ELFCLASS64 ? 8 : 4;
 
       sec = bfd_get_section_by_name (first_pbfd,
 				     NOTE_GNU_PROPERTY_SECTION_NAME);
@@ -426,76 +624,28 @@ _bfd_elf_link_setup_gnu_properties (stru
 	  return NULL;
 	}
 
-      /* 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)
+      /* Fix up GNU properties.  */
+      if (bed->fixup_gnu_properties)
+	bed->fixup_gnu_properties (info, &elf_properties (first_pbfd));
+
+      if (elf_properties (first_pbfd) == NULL)
 	{
-	  /* 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);
+	  /* Discard .note.gnu.property section if all properties have
+	     been removed.  */
+	  sec->output_section = bfd_abs_section_ptr;
+	  return NULL;
 	}
 
+      /* Compute the section size.  */
+      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 +658,58 @@ _bfd_elf_link_setup_gnu_properties (stru
 
   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 -rup binutils.orig/bfd/elf.c binutils-2.30/bfd/elf.c
--- binutils.orig/bfd/elf.c	2020-04-07 11:32:17.260776522 +0100
+++ binutils-2.30/bfd/elf.c	2020-04-07 13:34:03.898784096 +0100
@@ -4376,6 +4376,14 @@ get_program_header_size (bfd *abfd, stru
       ++segs;
     }
 
+  s = bfd_get_section_by_name (abfd,
+			       NOTE_GNU_PROPERTY_SECTION_NAME);
+  if (s != NULL && s->size != 0)
+    {
+      /* We need a PT_GNU_PROPERTY segment.  */
+      ++segs;
+    }
+
   for (s = abfd->sections; s != NULL; s = s->next)
     {
       if ((s->flags & SEC_LOAD) != 0
@@ -5028,6 +5036,24 @@ _bfd_elf_map_sections_to_segments (bfd *
 	      pm = &m->next;
 	    }
 
+      s = bfd_get_section_by_name (abfd,
+				   NOTE_GNU_PROPERTY_SECTION_NAME);
+      if (s != NULL && s->size != 0)
+	{
+	  amt = sizeof (struct elf_segment_map) + sizeof (asection *);
+	  m = bfd_zalloc (abfd, amt);
+	  if (m == NULL)
+	    goto error_return;
+	  m->next = NULL;
+	  m->p_type = PT_GNU_PROPERTY;
+	  m->count = 1;
+	  m->p_flags_valid = 1;
+	  m->sections[0] = s;
+	  m->p_flags = PF_R;
+	  *pm = m;
+	  pm = &m->next;
+	}
+
       /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
 	 segment.  */
       eh_frame_hdr = elf_eh_frame_hdr (abfd);
diff -rup binutils.orig/bfd/elfxx-target.h binutils-2.30/bfd/elfxx-target.h
--- binutils.orig/bfd/elfxx-target.h	2020-04-07 11:32:17.267776472 +0100
+++ binutils-2.30/bfd/elfxx-target.h	2020-04-07 13:34:03.899784089 +0100
@@ -543,6 +543,9 @@
 #ifndef elf_backend_setup_gnu_properties
 #define elf_backend_setup_gnu_properties	_bfd_elf_link_setup_gnu_properties
 #endif
+#ifndef elf_backend_fixup_gnu_properties
+#define elf_backend_fixup_gnu_properties	NULL
+#endif
 #ifndef elf_backend_static_tls_alignment
 #define elf_backend_static_tls_alignment	1
 #endif
@@ -884,6 +887,7 @@ static struct elf_backend_data elfNN_bed
   elf_backend_parse_gnu_properties,
   elf_backend_merge_gnu_properties,
   elf_backend_setup_gnu_properties,
+  elf_backend_fixup_gnu_properties,
   elf_backend_compact_eh_encoding,
   elf_backend_cant_unwind_opcode,
   elf_backend_init_secondary_reloc_section,
diff -rup binutils.orig/bfd/elfxx-x86.c binutils-2.30/bfd/elfxx-x86.c
--- binutils.orig/bfd/elfxx-x86.c	2020-04-07 11:32:17.271776442 +0100
+++ binutils-2.30/bfd/elfxx-x86.c	2020-04-07 13:34:03.899784089 +0100
@@ -2271,33 +2271,29 @@ _bfd_x86_elf_parse_gnu_properties (bfd *
 {
   elf_property *prop;
 
-  switch (type)
+  if (type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
+      || type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
+      || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
+	  && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
+      || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
+	  && type <= GNU_PROPERTY_X86_UINT32_OR_HI)
+      || (type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
+	  && type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
     {
-    case GNU_PROPERTY_X86_ISA_1_USED:
-    case GNU_PROPERTY_X86_ISA_1_NEEDED:
-    case GNU_PROPERTY_X86_FEATURE_1_AND:
       if (datasz != 4)
 	{
 	  _bfd_error_handler
-	    ((type == GNU_PROPERTY_X86_ISA_1_USED
-	      ? _("error: %B: <corrupt x86 ISA used size: 0x%x>")
-	      : (type == GNU_PROPERTY_X86_ISA_1_NEEDED
-		 ? _("error: %B: <corrupt x86 ISA needed size: 0x%x>")
-		 : _("error: %B: <corrupt x86 feature size: 0x%x>"))),
-	     abfd, datasz);
+	    (_("error: %pB: <corrupt x86 property (0x%x) size: 0x%x>"),
+	     abfd, type, datasz);
 	  return property_corrupt;
 	}
       prop = _bfd_elf_get_property (abfd, type, datasz);
-      /* Combine properties of the same type.  */
       prop->u.number |= bfd_h_get_32 (abfd, ptr);
       prop->pr_kind = property_number;
-      break;
-
-    default:
-      return property_ignored;
+      return property_number;
     }
 
-  return property_number;
+  return property_ignored;
 }
 
 /* Merge x86 GNU property BPROP with APROP.  If APROP isn't NULL,
@@ -2307,6 +2303,7 @@ _bfd_x86_elf_parse_gnu_properties (bfd *
 bfd_boolean
 _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
 				   bfd *abfd ATTRIBUTE_UNUSED,
+				   bfd *bbfd ATTRIBUTE_UNUSED,
 				   elf_property *aprop,
 				   elf_property *bprop)
 {
@@ -2314,15 +2311,38 @@ _bfd_x86_elf_merge_gnu_properties (struc
   bfd_boolean updated = FALSE;
   unsigned int pr_type = aprop != NULL ? aprop->pr_type : bprop->pr_type;
 
-  switch (pr_type)
+  if (pr_type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
+      || (pr_type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
+	  && pr_type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
+    {
+      if (aprop == NULL || bprop == NULL)
+	{
+	  /* Only one of APROP and BPROP can be NULL.  */
+	  if (aprop != NULL)
+	    {
+	      /* Remove this property since the other input file doesn't
+		 have it.  */
+	      aprop->pr_kind = property_remove;
+	      updated = TRUE;
+	    }
+	}
+      else
+	{
+	  number = aprop->u.number;
+	  aprop->u.number = number | bprop->u.number;
+	  updated = number != (unsigned int) aprop->u.number;
+	}
+      return updated;
+    }
+  else if (pr_type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
+	   || (pr_type >= GNU_PROPERTY_X86_UINT32_OR_LO
+	       && pr_type <= GNU_PROPERTY_X86_UINT32_OR_HI))
     {
-    case GNU_PROPERTY_X86_ISA_1_USED:
-    case GNU_PROPERTY_X86_ISA_1_NEEDED:
       if (aprop != NULL && bprop != NULL)
 	{
 	  number = aprop->u.number;
 	  aprop->u.number = number | bprop->u.number;
-	  /* Remove the property if ISA bits are empty.  */
+	  /* Remove the property if all bits are empty.  */
 	  if (aprop->u.number == 0)
 	    {
 	      aprop->pr_kind = property_remove;
@@ -2338,27 +2358,35 @@ _bfd_x86_elf_merge_gnu_properties (struc
 	    {
 	      if (aprop->u.number == 0)
 		{
-		  /* Remove APROP if ISA bits are empty.  */
+		  /* Remove APROP if all bits are empty.  */
 		  aprop->pr_kind = property_remove;
 		  updated = TRUE;
 		}
 	    }
 	  else
 	    {
-	      /* Return TRUE if APROP is NULL and ISA bits of BPROP
+	      /* Return TRUE if APROP is NULL and all bits of BPROP
 		 aren't empty to indicate that BPROP should be added
 		 to ABFD.  */
 	      updated = bprop->u.number != 0;
 	    }
 	}
-      break;
-
-    case GNU_PROPERTY_X86_FEATURE_1_AND:
+      return updated;
+    }
+  else if (pr_type >= GNU_PROPERTY_X86_UINT32_AND_LO
+	   && pr_type <= GNU_PROPERTY_X86_UINT32_AND_HI)
+    {
       /* Only one of APROP and BPROP can be NULL:
 	 1. APROP & BPROP when both APROP and BPROP aren't NULL.
 	 2. If APROP is NULL, remove x86 feature.
 	 3. Otherwise, do nothing.
        */
+      const struct elf_backend_data *bed
+	= get_elf_backend_data (info->output_bfd);
+      struct elf_x86_link_hash_table *htab
+	= elf_x86_hash_table (info, bed->target_id);
+      if (!htab)
+	abort ();
       if (aprop != NULL && bprop != NULL)
 	{
 	  features = 0;
@@ -2404,9 +2432,10 @@ _bfd_x86_elf_merge_gnu_properties (struc
 	      updated = TRUE;
 	    }
 	}
-      break;
-
-    default:
+      return updated;
+    }
+  else
+    {
       /* Never should happen.  */
       abort ();
     }
@@ -2434,12 +2463,12 @@ _bfd_x86_elf_link_setup_gnu_properties
   const struct elf_backend_data *bed;
   unsigned int class_align = ABI_64_P (info->output_bfd) ? 3 : 2;
   unsigned int got_align;
-
-  features = 0;
-  if (info->ibt)
-    features = GNU_PROPERTY_X86_FEATURE_1_IBT;
-  if (info->shstk)
-    features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+  enum report
+  {
+   report_none	= 0,	    /* Do nothing.  */
+   report_ibt	= 1 << 2,   /* Report missing IBT property.  */
+   report_shstk	= 1 << 3    /* Report missing SHSTK property.  */
+  } report;
 
   /* Find a normal input file with GNU property note.  */
   for (pbfd = info->input_bfds;
@@ -2454,18 +2483,46 @@ _bfd_x86_elf_link_setup_gnu_properties
 	  break;
       }
 
-  if (ebfd != NULL && features)
+  bed = get_elf_backend_data (info->output_bfd);
+
+  htab = elf_x86_hash_table (info, bed->target_id);
+  if (htab == NULL)
+    return pbfd;
+
+  features = 0;
+  report = report_ibt | report_shstk;
+
+  if (info->ibt)
     {
-      /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT and
-	 GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
-      prop = _bfd_elf_get_property (ebfd,
-				    GNU_PROPERTY_X86_FEATURE_1_AND,
-				    4);
-      prop->u.number |= features;
-      prop->pr_kind = property_number;
+      features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+      report &= ~ report_ibt;
+    }
+
+  if (info->shstk)
+    {
+      features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+      report &= ~ report_shstk;
+    }
+
+  if (report == 0)
+    info->cet_report = 0;
+
+  if (ebfd != NULL)
+    {
+      prop = NULL;
+      if (features)
+	{
+	  /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT and
+	     GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
+	  prop = _bfd_elf_get_property (ebfd,
+					GNU_PROPERTY_X86_FEATURE_1_AND,
+					4);
+	  prop->u.number |= features;
+	  prop->pr_kind = property_number;
+	}
 
       /* Create the GNU property note section if needed.  */
-      if (pbfd == NULL)
+      if (prop != NULL && pbfd == NULL)
 	{
 	  sec = bfd_make_section_with_flags (ebfd,
 					     NOTE_GNU_PROPERTY_SECTION_NAME,
@@ -2481,7 +2538,7 @@ _bfd_x86_elf_link_setup_gnu_properties
 	  if (!bfd_set_section_alignment (ebfd, sec, class_align))
 	    {
 error_alignment:
-	      info->callbacks->einfo (_("%F%A: failed to align section\n"),
+	      info->callbacks->einfo (_("%F%pA: failed to align section\n"),
 				      sec);
 	    }
 
@@ -2489,13 +2546,53 @@ error_alignment:
 	}
     }
 
-  pbfd = _bfd_elf_link_setup_gnu_properties (info);
+  if (info->cet_report)
+    {
+      /* Report missing IBT and SHSTK properties.  */
+      bfd *abfd;
+      const char *msg;
+      elf_property_list *p;
+      bfd_boolean missing_ibt, missing_shstk;
+      bfd_boolean check_ibt   = !!(report & report_ibt);
+      bfd_boolean check_shstk = !!(report & report_shstk);
 
-  bed = get_elf_backend_data (info->output_bfd);
+      if (info->cet_report == 1)
+	msg = _("%P: %B: warning: missing %s\n");
+      else
+	msg = _("%X%P: %B: error: missing %s\n");
 
-  htab = elf_x86_hash_table (info, bed->target_id);
-  if (htab == NULL)
-    return pbfd;
+      for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
+	if (!(abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED))
+	    && bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+	  {
+	    for (p = elf_properties (abfd); p; p = p->next)
+	      if (p->property.pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
+		break;
+
+	    missing_ibt = check_ibt;
+	    missing_shstk = check_shstk;
+	    if (p)
+	      {
+		missing_ibt &= !(p->property.u.number
+				 & GNU_PROPERTY_X86_FEATURE_1_IBT);
+		missing_shstk &= !(p->property.u.number
+				   & GNU_PROPERTY_X86_FEATURE_1_SHSTK);
+	      }
+	    if (missing_ibt || missing_shstk)
+	      {
+		const char *missing;
+		if (missing_ibt && missing_shstk)
+		  missing = _("IBT and SHSTK properties");
+		else if (missing_ibt)
+		  missing = _("IBT property");
+		else
+		  missing = _("SHSTK property");
+		info->callbacks->einfo (msg, abfd, missing);
+	      }
+	  }
+    }
+
+  pbfd = _bfd_elf_link_setup_gnu_properties (info);
 
   htab->r_info = init_table->r_info;
   htab->r_sym = init_table->r_sym;
@@ -2806,3 +2903,47 @@ error_alignment:
 
   return pbfd;
 }
+
+/* Fix up x86 GNU properties.  */
+
+void
+_bfd_x86_elf_link_fixup_gnu_properties
+  (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+   elf_property_list **listp)
+{
+  elf_property_list *p;
+
+  for (p = *listp; p; p = p->next)
+    {
+      unsigned int type = p->property.pr_type;
+
+      if (type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
+	  || type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
+	  || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
+	      && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
+	  || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
+	      && type <= GNU_PROPERTY_X86_UINT32_OR_HI)
+	  || (type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
+	      && type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
+	{
+	  if (p->property.u.number == 0
+	      && (type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
+		  || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
+		      && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
+		  || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
+		      && type <= GNU_PROPERTY_X86_UINT32_OR_HI)))
+	    {
+	      /* Remove empty property.  */
+	      *listp = p->next;
+	      continue;
+	    }
+
+	  listp = &p->next;
+	}
+      else if (type > GNU_PROPERTY_HIPROC)
+	{
+	  /* The property list is sorted in order of type.  */
+	  break;
+	}
+    }
+}
diff -rup binutils.orig/bfd/elfxx-x86.h binutils-2.30/bfd/elfxx-x86.h
--- binutils.orig/bfd/elfxx-x86.h	2020-04-07 11:32:17.280776377 +0100
+++ binutils-2.30/bfd/elfxx-x86.h	2020-04-07 13:34:03.900784082 +0100
@@ -653,11 +653,14 @@ extern enum elf_property_kind _bfd_x86_e
   (bfd *, unsigned int, bfd_byte *, unsigned int);
 
 extern bfd_boolean _bfd_x86_elf_merge_gnu_properties
-  (struct bfd_link_info *, bfd *, elf_property *, elf_property *);
+  (struct bfd_link_info *, bfd *, bfd *, elf_property *, elf_property *);
 
 extern bfd * _bfd_x86_elf_link_setup_gnu_properties
   (struct bfd_link_info *, struct elf_x86_init_table *);
 
+extern void _bfd_x86_elf_link_fixup_gnu_properties
+  (struct bfd_link_info *, elf_property_list **);
+
 #define bfd_elf64_mkobject \
   _bfd_x86_elf_mkobject
 #define bfd_elf32_mkobject \
@@ -693,3 +696,5 @@ extern bfd * _bfd_x86_elf_link_setup_gnu
   _bfd_x86_elf_parse_gnu_properties
 #define elf_backend_merge_gnu_properties \
   _bfd_x86_elf_merge_gnu_properties
+#define elf_backend_fixup_gnu_properties \
+  _bfd_x86_elf_link_fixup_gnu_properties
diff -rup binutils.orig/binutils/readelf.c binutils-2.30/binutils/readelf.c
--- binutils.orig/binutils/readelf.c	2020-04-07 11:32:17.244776638 +0100
+++ binutils-2.30/binutils/readelf.c	2020-04-07 13:34:03.901784074 +0100
@@ -3910,6 +3910,7 @@ get_segment_type (Filedata * filedata, u
     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
     case PT_GNU_STACK:	return "GNU_STACK";
     case PT_GNU_RELRO:  return "GNU_RELRO";
+    case PT_GNU_PROPERTY: return "GNU_PROPERTY";
 
     default:
       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
@@ -16843,8 +16844,87 @@ get_gnu_elf_note_type (unsigned e_type)
 }
 
 static void
+decode_x86_compat_isa (unsigned int bitmask)
+{
+  while (bitmask)
+    {
+      unsigned int bit = bitmask & (- bitmask);
+
+      bitmask &= ~ bit;
+      switch (bit)
+	{
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
+	  printf ("i486");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
+	  printf ("586");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
+	  printf ("686");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
+	  printf ("SSE");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
+	  printf ("SSE2");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
+	  printf ("SSE3");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
+	  printf ("SSSE3");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
+	  printf ("SSE4_1");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
+	  printf ("SSE4_2");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
+	  printf ("AVX");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
+	  printf ("AVX2");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
+	  printf ("AVX512F");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
+	  printf ("AVX512CD");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
+	  printf ("AVX512ER");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
+	  printf ("AVX512PF");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
+	  printf ("AVX512VL");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
+	  printf ("AVX512DQ");
+	  break;
+	case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
+	  printf ("AVX512BW");
+	  break;
+	default:
+	  printf (_("<unknown: %x>"), bit);
+	  break;
+	}
+      if (bitmask)
+	printf (", ");
+    }
+}
+
+static void
 decode_x86_isa (unsigned int bitmask)
 {
+  if (!bitmask)
+    {
+      printf (_("<None>"));
+      return;
+    }
+
   while (bitmask)
     {
       unsigned int bit = bitmask & (- bitmask);
@@ -16852,25 +16932,84 @@ decode_x86_isa (unsigned int bitmask)
       bitmask &= ~ bit;
       switch (bit)
 	{
-	case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
-	case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
-	case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
-	case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
-	case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
-	case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
-	case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
-	case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
-	case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
-	case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
-	default: printf (_("<unknown: %x>"), bit); break;
+	case GNU_PROPERTY_X86_ISA_1_CMOV:
+	  printf ("CMOV");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_SSE:
+	  printf ("SSE");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_SSE2:
+	  printf ("SSE2");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_SSE3:
+	  printf ("SSE3");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_SSSE3:
+	  printf ("SSSE3");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_SSE4_1:
+	  printf ("SSE4_1");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_SSE4_2:
+	  printf ("SSE4_2");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX:
+	  printf ("AVX");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX2:
+	  printf ("AVX2");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_FMA:
+	  printf ("FMA");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512F:
+	  printf ("AVX512F");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512CD:
+	  printf ("AVX512CD");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512ER:
+	  printf ("AVX512ER");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512PF:
+	  printf ("AVX512PF");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512VL:
+	  printf ("AVX512VL");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
+	  printf ("AVX512DQ");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512BW:
+	  printf ("AVX512BW");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
+	  printf ("AVX512_4FMAPS");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
+	  printf ("AVX512_4VNNIW");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
+	  printf ("AVX512_BITALG");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
+	  printf ("AVX512_IFMA");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
+	  printf ("AVX512_VBMI");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
+	  printf ("AVX512_VBMI2");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
+	  printf ("AVX512_VNNI");
+	  break;
+	case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
+	  printf ("AVX512_BF16");
+	  break;
+	default:
+	  printf (_("<unknown: %x>"), bit);
+	  break;
 	}
       if (bitmask)
 	printf (", ");
@@ -16878,8 +17017,14 @@ decode_x86_isa (unsigned int bitmask)
 }
 
 static void
-decode_x86_feature (unsigned int type, unsigned int bitmask)
+decode_x86_feature_1 (unsigned int bitmask)
 {
+  if (!bitmask)
+    {
+      printf (_("<None>"));
+      return;
+    }
+
   while (bitmask)
     {
       unsigned int bit = bitmask & (- bitmask);
@@ -16888,26 +17033,65 @@ decode_x86_feature (unsigned int type, u
       switch (bit)
 	{
 	case GNU_PROPERTY_X86_FEATURE_1_IBT:
-	  switch (type)
-	    {
-	    case GNU_PROPERTY_X86_FEATURE_1_AND:
-	      printf ("IBT");
-	      break;
-	    default:
-	      /* This should never happen.  */
-	      abort ();
-	    }
+	  printf ("IBT");
 	  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 ();
-	    }
+	  printf ("SHSTK");
+	  break;
+	default:
+	  printf (_("<unknown: %x>"), bit);
+	  break;
+	}
+      if (bitmask)
+	printf (", ");
+    }
+}
+
+static void
+decode_x86_feature_2 (unsigned int bitmask)
+{
+  if (!bitmask)
+    {
+      printf (_("<None>"));
+      return;
+    }
+
+  while (bitmask)
+    {
+      unsigned int bit = bitmask & (- bitmask);
+
+      bitmask &= ~ bit;
+      switch (bit)
+	{
+	case GNU_PROPERTY_X86_FEATURE_2_X86:
+	  printf ("x86");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_X87:
+	  printf ("x87");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_MMX:
+	  printf ("MMX");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_XMM:
+	  printf ("XMM");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_YMM:
+	  printf ("YMM");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_ZMM:
+	  printf ("ZMM");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_FXSR:
+	  printf ("FXSR");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
+	  printf ("XSAVE");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
+	  printf ("XSAVEOPT");
+	  break;
+	case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
+	  printf ("XSAVEC");
 	  break;
 	default:
 	  printf (_("<unknown: %x>"), bit);
@@ -16963,30 +17147,89 @@ print_gnu_property_note (Filedata * file
 	      || filedata->file_header.e_machine == EM_IAMCU
 	      || filedata->file_header.e_machine == EM_386)
 	    {
+	      unsigned int bitmask;
+
+	      if (datasz == 4)
+		bitmask = byte_get (ptr, 4);
+	      else
+		bitmask = 0;
+
 	      switch (type)
 		{
 		case GNU_PROPERTY_X86_ISA_1_USED:
-		  printf ("x86 ISA used: ");
 		  if (datasz != 4)
-		    printf (_("<corrupt length: %#x> "), datasz);
+		    printf (_("x86 ISA used: <corrupt length: %#x> "),
+			    datasz);
 		  else
-		    decode_x86_isa (byte_get (ptr, 4));
+		    {
+		      printf ("x86 ISA used: ");
+		      decode_x86_isa (bitmask);
+		    }
 		  goto next;
 
 		case GNU_PROPERTY_X86_ISA_1_NEEDED:
-		  printf ("x86 ISA needed: ");
 		  if (datasz != 4)
-		    printf (_("<corrupt length: %#x> "), datasz);
+		    printf (_("x86 ISA needed: <corrupt length: %#x> "),
+			    datasz);
 		  else
-		    decode_x86_isa (byte_get (ptr, 4));
+		    {
+		      printf ("x86 ISA needed: ");
+		      decode_x86_isa (bitmask);
+		    }
 		  goto next;
 
 		case GNU_PROPERTY_X86_FEATURE_1_AND:
-		  printf ("x86 feature: ");
 		  if (datasz != 4)
-		    printf (_("<corrupt length: %#x> "), datasz);
+		    printf (_("x86 feature: <corrupt length: %#x> "),
+			    datasz);
 		  else
-		    decode_x86_feature (type, byte_get (ptr, 4));
+		    {
+		      printf ("x86 feature: ");
+		      decode_x86_feature_1 (bitmask);
+		    }
+		  goto next;
+
+		case GNU_PROPERTY_X86_FEATURE_2_USED:
+		  if (datasz != 4)
+		    printf (_("x86 feature used: <corrupt length: %#x> "),
+			    datasz);
+		  else
+		    {
+		      printf ("x86 feature used: ");
+		      decode_x86_feature_2 (bitmask);
+		    }
+		  goto next;
+
+		case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
+		  if (datasz != 4)
+		    printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
+		  else
+		    {
+		      printf ("x86 feature needed: ");
+		      decode_x86_feature_2 (bitmask);
+		    }
+		  goto next;
+
+		case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
+		  if (datasz != 4)
+		    printf (_("x86 ISA used: <corrupt length: %#x> "),
+			    datasz);
+		  else
+		    {
+		      printf ("x86 ISA used: ");
+		      decode_x86_compat_isa (bitmask);
+		    }
+		  goto next;
+
+		case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
+		  if (datasz != 4)
+		    printf (_("x86 ISA needed: <corrupt length: %#x> "),
+			    datasz);
+		  else
+		    {
+		      printf ("x86 ISA needed: ");
+		      decode_x86_compat_isa (bitmask);
+		    }
 		  goto next;
 
 		default:
@@ -17144,7 +17387,7 @@ print_gnu_note (Filedata * filedata, Elf
     case NT_GNU_PROPERTY_TYPE_0:
       print_gnu_property_note (filedata, pnote);
       break;
-      
+
     default:
       /* Handle unrecognised types.  An error message should have already been
 	 created by get_gnu_elf_note_type(), so all that we need to do is to
diff -rup binutils.orig/binutils/testsuite/binutils-all/i386/empty.d binutils-2.30/binutils/testsuite/binutils-all/i386/empty.d
--- binutils.orig/binutils/testsuite/binutils-all/i386/empty.d	2020-04-07 11:32:17.248776609 +0100
+++ binutils-2.30/binutils/testsuite/binutils-all/i386/empty.d	2020-04-07 13:34:03.901784074 +0100
@@ -6,4 +6,4 @@
 Displaying notes found in: .note.gnu.property
   Owner                 Data size	Description
   GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
-      Properties: x86 feature: 
+      Properties: x86 feature: <None>
diff -rup binutils.orig/binutils/testsuite/binutils-all/i386/pr21231b.d binutils-2.30/binutils/testsuite/binutils-all/i386/pr21231b.d
--- binutils.orig/binutils/testsuite/binutils-all/i386/pr21231b.d	2020-04-07 11:32:17.248776609 +0100
+++ binutils-2.30/binutils/testsuite/binutils-all/i386/pr21231b.d	2020-04-07 13:34:03.901784074 +0100
@@ -1,5 +1,5 @@
 #PROG: objcopy
-#as: --32
+#as: --32 -mx86-used-note=yes
 #objcopy:
 #readelf: -n
 
@@ -8,5 +8,8 @@ Displaying notes found in: .note.gnu.pro
   GNU                  0x0000002c	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x800000
 	no copy on protected 
-	x86 ISA used: i486, 586, 686, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, <unknown: 40000>, <unknown: 80000>, <unknown: 100000>, <unknown: 200000>, <unknown: 400000>, <unknown: 800000>, <unknown: 1000000>, <unknown: 2000000>, <unknown: 4000000>, <unknown: 8000000>, <unknown: 10000000>, <unknown: 20000000>, <unknown: 40000000>, <unknown: 80000000>
-	x86 ISA needed: i486, 586, 686, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL
+	x86 ISA used: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, AVX512_4FMAPS, AVX512_4VNNIW, AVX512_BITALG, AVX512_IFMA, AVX512_VBMI, AVX512_VBMI2, AVX512_VNNI, AVX512_BF16, <unknown: 2000000>, <unknown: 4000000>, <unknown: 8000000>, <unknown: 10000000>, <unknown: 20000000>, <unknown: 40000000>
+	x86 ISA needed: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL, AVX512DQ
+  GNU                  0x00000018	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/binutils/testsuite/binutils-all/i386/pr21231b.s binutils-2.30/binutils/testsuite/binutils-all/i386/pr21231b.s
--- binutils.orig/binutils/testsuite/binutils-all/i386/pr21231b.s	2020-04-07 11:32:17.248776609 +0100
+++ binutils-2.30/binutils/testsuite/binutils-all/i386/pr21231b.s	2020-04-07 13:34:03.902784067 +0100
@@ -19,14 +19,14 @@
 	.long 0			/* pr_datasz.  */
 	.p2align 2
 	/* GNU_PROPERTY_X86_ISA_1_USED */
-	.long 0xc0000000	/* pr_type.  */
+	.long 0xc0010000	/* pr_type.  */
 	.long 4f - 3f		/* pr_datasz.  */
 3:
-	.long -1
+	.long 0x7fffffff
 4:
 	.p2align 2
 	/* GNU_PROPERTY_X86_ISA_1_NEEDED */
-	.long 0xc0000001	/* pr_type.  */
+	.long 0xc0008000	/* pr_type.  */
 	.long 4f - 3f		/* pr_datasz.  */
 3:
 	.long 0xffff
diff -rup binutils.orig/binutils/testsuite/binutils-all/x86-64/empty-x32.d binutils-2.30/binutils/testsuite/binutils-all/x86-64/empty-x32.d
--- binutils.orig/binutils/testsuite/binutils-all/x86-64/empty-x32.d	2020-04-07 11:32:17.250776595 +0100
+++ binutils-2.30/binutils/testsuite/binutils-all/x86-64/empty-x32.d	2020-04-07 13:34:03.902784067 +0100
@@ -7,4 +7,4 @@
 Displaying notes found in: .note.gnu.property
   Owner                 Data size	Description
   GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
-      Properties: x86 feature: 
+      Properties: x86 feature: <None>
diff -rup binutils.orig/binutils/testsuite/binutils-all/x86-64/empty.d binutils-2.30/binutils/testsuite/binutils-all/x86-64/empty.d
--- binutils.orig/binutils/testsuite/binutils-all/x86-64/empty.d	2020-04-07 11:32:17.250776595 +0100
+++ binutils-2.30/binutils/testsuite/binutils-all/x86-64/empty.d	2020-04-07 13:34:03.902784067 +0100
@@ -6,4 +6,4 @@
 Displaying notes found in: .note.gnu.property
   Owner                 Data size	Description
   GNU                  0x00000010	NT_GNU_PROPERTY_TYPE_0
-      Properties: x86 feature: 
+      Properties: x86 feature: <None>
diff -rup binutils.orig/binutils/testsuite/binutils-all/x86-64/pr21231b.d binutils-2.30/binutils/testsuite/binutils-all/x86-64/pr21231b.d
--- binutils.orig/binutils/testsuite/binutils-all/x86-64/pr21231b.d	2020-04-07 11:32:17.250776595 +0100
+++ binutils-2.30/binutils/testsuite/binutils-all/x86-64/pr21231b.d	2020-04-07 13:34:03.902784067 +0100
@@ -1,5 +1,5 @@
 #PROG: objcopy
-#as: --64
+#as: --64 -mx86-used-note=yes
 #objcopy:
 #readelf: -n
 
@@ -8,5 +8,8 @@ Displaying notes found in: .note.gnu.pro
   GNU                  0x00000038	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x800000
 	no copy on protected 
-	x86 ISA used: i486, 586, 686, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, <unknown: 40000>, <unknown: 80000>, <unknown: 100000>, <unknown: 200000>, <unknown: 400000>, <unknown: 800000>, <unknown: 1000000>, <unknown: 2000000>, <unknown: 4000000>, <unknown: 8000000>, <unknown: 10000000>, <unknown: 20000000>, <unknown: 40000000>, <unknown: 80000000>
-	x86 ISA needed: i486, 586, 686, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL
+	x86 ISA used: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, AVX512_4FMAPS, AVX512_4VNNIW, AVX512_BITALG, AVX512_IFMA, AVX512_VBMI, AVX512_VBMI2, AVX512_VNNI, AVX512_BF16, <unknown: 2000000>, <unknown: 4000000>, <unknown: 8000000>, <unknown: 10000000>, <unknown: 20000000>, <unknown: 40000000>
+	x86 ISA needed: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL, AVX512DQ
+  GNU                  0x00000020	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/binutils/testsuite/binutils-all/x86-64/pr21231b.s binutils-2.30/binutils/testsuite/binutils-all/x86-64/pr21231b.s
--- binutils.orig/binutils/testsuite/binutils-all/x86-64/pr21231b.s	2020-04-07 11:32:17.250776595 +0100
+++ binutils-2.30/binutils/testsuite/binutils-all/x86-64/pr21231b.s	2020-04-07 13:34:03.902784067 +0100
@@ -19,14 +19,14 @@
 	.long 0			/* pr_datasz.  */
 	.p2align 3
 	/* GNU_PROPERTY_X86_ISA_1_USED */
-	.long 0xc0000000	/* pr_type.  */
+	.long 0xc0010000	/* pr_type.  */
 	.long 4f - 3f		/* pr_datasz.  */
 3:
-	.long -1
+	.long 0x7fffffff
 4:
 	.p2align 3
 	/* GNU_PROPERTY_X86_ISA_1_NEEDED */
-	.long 0xc0000001	/* pr_type.  */
+	.long 0xc0008000	/* pr_type.  */
 	.long 4f - 3f		/* pr_datasz.  */
 3:
 	.long 0xffff
diff -rup binutils.orig/gas/config/tc-i386.c binutils-2.30/gas/config/tc-i386.c
--- binutils.orig/gas/config/tc-i386.c	2020-04-07 11:32:17.528774573 +0100
+++ binutils-2.30/gas/config/tc-i386.c	2020-04-07 13:36:05.123911315 +0100
@@ -191,6 +191,13 @@ static void s_bss (int);
 #endif
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
 static void handle_large_common (int small ATTRIBUTE_UNUSED);
+
+/* GNU_PROPERTY_X86_ISA_1_USED.  */
+static unsigned int x86_isa_1_used;
+/* GNU_PROPERTY_X86_FEATURE_2_USED.  */
+static unsigned int x86_feature_2_used;
+/* Generate x86 used ISA and feature properties.  */
+static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
 #endif
 
 static const char *default_arch = DEFAULT_ARCH;
@@ -7421,6 +7428,127 @@ encoding_length (const fragS *start_frag
   return len - start_off + (frag_now_ptr - frag_now->fr_literal);
 }
 
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
+void
+x86_cleanup (void)
+{
+  char *p;
+  asection *seg = now_seg;
+  subsegT subseg = now_subseg;
+  asection *sec;
+  unsigned int alignment, align_size_1;
+  unsigned int isa_1_descsz, feature_2_descsz, descsz;
+  unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
+  unsigned int padding;
+
+  if (!IS_ELF || !x86_used_note)
+    return;
+
+  x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
+
+  /* The .note.gnu.property section layout:
+
+     Field	Length		Contents
+     ----	----		----
+     n_namsz	4		4
+     n_descsz	4		The note descriptor size
+     n_type	4		NT_GNU_PROPERTY_TYPE_0
+     n_name	4		"GNU"
+     n_desc	n_descsz	The program property array
+     ....	....		....
+   */
+
+  /* Create the .note.gnu.property section.  */
+  sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
+  bfd_set_section_flags (stdoutput, sec,
+			 (SEC_ALLOC
+			  | SEC_LOAD
+			  | SEC_DATA
+			  | SEC_HAS_CONTENTS
+			  | SEC_READONLY));
+
+  if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
+    {
+      align_size_1 = 7;
+      alignment = 3;
+    }
+  else
+    {
+      align_size_1 = 3;
+      alignment = 2;
+    }
+
+  bfd_set_section_alignment (stdoutput, sec, alignment);
+  elf_section_type (sec) = SHT_NOTE;
+
+  /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
+				  + 4-byte data  */
+  isa_1_descsz_raw = 4 + 4 + 4;
+  /* Align GNU_PROPERTY_X86_ISA_1_USED.  */
+  isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
+
+  feature_2_descsz_raw = isa_1_descsz;
+  /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
+				      + 4-byte data  */
+  feature_2_descsz_raw += 4 + 4 + 4;
+  /* Align GNU_PROPERTY_X86_FEATURE_2_USED.  */
+  feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
+		      & ~align_size_1);
+
+  descsz = feature_2_descsz;
+  /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz.  */
+  p = frag_more (4 + 4 + 4 + 4 + descsz);
+
+  /* Write n_namsz.  */
+  md_number_to_chars (p, (valueT) 4, 4);
+
+  /* Write n_descsz.  */
+  md_number_to_chars (p + 4, (valueT) descsz, 4);
+
+  /* Write n_type.  */
+  md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
+
+  /* Write n_name.  */
+  memcpy (p + 4 * 3, "GNU", 4);
+
+  /* Write 4-byte type.  */
+  md_number_to_chars (p + 4 * 4,
+		      (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
+
+  /* Write 4-byte data size.  */
+  md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
+
+  /* Write 4-byte data.  */
+  md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
+
+  /* Zero out paddings.  */
+  padding = isa_1_descsz - isa_1_descsz_raw;
+  if (padding)
+    memset (p + 4 * 7, 0, padding);
+
+  /* Write 4-byte type.  */
+  md_number_to_chars (p + isa_1_descsz + 4 * 4,
+		      (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
+
+  /* Write 4-byte data size.  */
+  md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
+
+  /* Write 4-byte data.  */
+  md_number_to_chars (p + isa_1_descsz + 4 * 6,
+		      (valueT) x86_feature_2_used, 4);
+
+  /* Zero out paddings.  */
+  padding = feature_2_descsz - feature_2_descsz_raw;
+  if (padding)
+    memset (p + isa_1_descsz + 4 * 7, 0, padding);
+
+  /* We probably can't restore the current segment, for there likely
+     isn't one yet...  */
+  if (seg && subseg)
+    subseg_set (seg, subseg);
+}
+#endif
+
 static void
 output_insn (void)
 {
@@ -7429,6 +7557,99 @@ output_insn (void)
   fragS *fragP = NULL;
   enum align_branch_kind branch = align_branch_none;
 
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
+  if (IS_ELF && x86_used_note)
+    {
+#if 0
+      if (i.tm.cpu_flags.bitfield.cpucmov)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
+#endif
+      if (i.tm.cpu_flags.bitfield.cpusse)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
+      if (i.tm.cpu_flags.bitfield.cpusse2)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
+      if (i.tm.cpu_flags.bitfield.cpusse3)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
+      if (i.tm.cpu_flags.bitfield.cpussse3)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
+      if (i.tm.cpu_flags.bitfield.cpusse4_1)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
+      if (i.tm.cpu_flags.bitfield.cpusse4_2)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
+      if (i.tm.cpu_flags.bitfield.cpuavx)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
+      if (i.tm.cpu_flags.bitfield.cpuavx2)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
+      if (i.tm.cpu_flags.bitfield.cpufma)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
+      if (i.tm.cpu_flags.bitfield.cpuavx512f)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
+      if (i.tm.cpu_flags.bitfield.cpuavx512cd)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
+      if (i.tm.cpu_flags.bitfield.cpuavx512er)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
+      if (i.tm.cpu_flags.bitfield.cpuavx512pf)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
+      if (i.tm.cpu_flags.bitfield.cpuavx512vl)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
+      if (i.tm.cpu_flags.bitfield.cpuavx512dq)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
+      if (i.tm.cpu_flags.bitfield.cpuavx512bw)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
+      if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
+      if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
+      if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
+      if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
+      if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
+      if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
+      if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
+#if 0
+      if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
+	x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
+#endif
+
+      if (i.tm.cpu_flags.bitfield.cpu8087
+	  || i.tm.cpu_flags.bitfield.cpu287
+	  || i.tm.cpu_flags.bitfield.cpu387
+	  || i.tm.cpu_flags.bitfield.cpu687
+	  || i.tm.cpu_flags.bitfield.cpufisttp)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
+#if 0
+      /* Don't set GNU_PROPERTY_X86_FEATURE_2_MMX for prefetchtXXX nor
+	 Xfence instructions.  */
+      if (i.tm.base_opcode != 0xf18
+	  && i.tm.base_opcode != 0xf0d
+	  && i.tm.base_opcode != 0xfae
+	  && (i.has_regmmx
+	      || i.tm.cpu_flags.bitfield.cpummx
+	      || i.tm.cpu_flags.bitfield.cpua3dnow
+	      || i.tm.cpu_flags.bitfield.cpua3dnowa))
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
+      if (i.has_regxmm)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
+      if (i.has_regymm)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
+      if (i.has_regzmm)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
+      if (i.tm.cpu_flags.bitfield.cpufxsr)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
+#endif
+      if (i.tm.cpu_flags.bitfield.cpuxsave)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
+      if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
+      if (i.tm.cpu_flags.bitfield.cpuxsavec)
+	x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
+    }
+#endif
+
   /* Tie dwarf2 debug info to the address at the start of the insn.
      We can't do this after the insn has been output as the current
      frag may have been closed off.  eg. by frag_var.  */
@@ -10829,6 +11050,7 @@ const char *md_shortopts = "qn";
 #define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
 #define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
 #define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
+#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 31)
 
 struct option md_longopts[] =
 {
@@ -10840,6 +11062,7 @@ struct option md_longopts[] =
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
   {"x32", no_argument, NULL, OPTION_X32},
   {"mshared", no_argument, NULL, OPTION_MSHARED},
+  {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
 #endif
   {"divide", no_argument, NULL, OPTION_DIVIDE},
   {"march", required_argument, NULL, OPTION_MARCH},
@@ -10957,6 +11180,15 @@ md_parse_option (int c, const char *arg)
       else
 	as_fatal (_("32bit x86_64 is only supported for ELF"));
       break;
+
+    case OPTION_X86_USED_NOTE:
+      if (strcasecmp (arg, "yes") == 0)
+        x86_used_note = 1;
+      else if (strcasecmp (arg, "no") == 0)
+        x86_used_note = 0;
+      else
+        as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
+      break;
 #endif
 
     case OPTION_32:
@@ -11448,6 +11680,14 @@ md_show_usage (FILE *stream)
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
   fprintf (stream, _("\
   -s                      ignored\n"));
+  fprintf (stream, _("\
+  -mx86-used-note=[no|yes] "));
+  if (DEFAULT_X86_USED_NOTE)
+    fprintf (stream, _("(default: yes)\n"));
+  else
+    fprintf (stream, _("(default: no)\n"));
+  fprintf (stream, _("\
+                          generate x86 used ISA and feature properties\n"));
 #endif
 #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
      || defined (TE_PE) || defined (TE_PEP))
diff -rup binutils.orig/gas/config/tc-i386.h binutils-2.30/gas/config/tc-i386.h
--- binutils.orig/gas/config/tc-i386.h	2020-04-07 11:32:17.526774588 +0100
+++ binutils-2.30/gas/config/tc-i386.h	2020-04-07 13:34:03.904784053 +0100
@@ -346,6 +346,11 @@ extern bfd_vma x86_64_section_letter (in
 #define md_elf_section_letter(LETTER, PTR_MSG)	x86_64_section_letter (LETTER, PTR_MSG)
 #define md_elf_section_word(STR, LEN)		x86_64_section_word (STR, LEN)
 
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
+extern void x86_cleanup (void);
+#define md_cleanup() x86_cleanup ()
+#endif
+
 #ifdef TE_PE
 
 #define O_secrel O_md1
diff -rup binutils.orig/gas/config.in binutils-2.30/gas/config.in
--- binutils.orig/gas/config.in	2020-04-07 11:32:17.532774544 +0100
+++ binutils-2.30/gas/config.in	2020-04-07 13:34:03.904784053 +0100
@@ -50,6 +50,10 @@
 /* Define to 1 if you want to generate x86 relax relocations by default. */
 #undef DEFAULT_GENERATE_X86_RELAX_RELOCATIONS
 
+/* Define to 1 if you want to generate GNU x86 used ISA and feature properties
+   by default. */
+#undef DEFAULT_X86_USED_NOTE
+
 /* Supported emulations. */
 #undef EMULATIONS
 
diff -rup binutils.orig/gas/configure binutils-2.30/gas/configure
--- binutils.orig/gas/configure	2020-04-07 11:32:17.519774639 +0100
+++ binutils-2.30/gas/configure	2020-04-07 13:34:03.905784046 +0100
@@ -772,6 +772,7 @@ enable_compressed_debug_sections
 enable_x86_relax_relocations
 enable_elf_stt_common
 enable_generate_build_notes
+enable_x86_used_note
 enable_werror
 enable_build_warnings
 with_cpu
@@ -11788,6 +11789,18 @@ if test "${enable_generate_build_notes+s
 esac
 fi
 
+# Decide if the x86 ELF assembler should default to generating GNU x86
+# used ISA and feature properties.
+ac_default_generate_x86_used_note=unset
+# Provide a configuration option to override the default.
+# Check whether --enable-x86-used-note was given.
+if test "${enable_x86_used_note+set}" = set; then :
+  enableval=$enable_x86_used_note; case "${enableval}" in
+  yes)  ac_default_generate_x86_used_note=1 ;;
+  no)   ac_default_generate_x86_used_note=0 ;;
+esac
+fi
+
 
 using_cgen=no
 
@@ -12736,6 +12749,14 @@ cat >>confdefs.h <<_ACEOF
 #define DEFAULT_GENERATE_BUILD_NOTES $ac_default_generate_build_notes
 _ACEOF
 
+if test ${ac_default_generate_x86_used_note} = unset; then
+  ac_default_generate_x86_used_note=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_X86_USED_NOTE $ac_default_generate_x86_used_note
+_ACEOF
+
 
 if test x$ac_default_compressed_debug_sections = xyes ; then
 
diff -rup binutils.orig/gas/configure.ac binutils-2.30/gas/configure.ac
--- binutils.orig/gas/configure.ac	2020-04-07 11:32:17.533774537 +0100
+++ binutils-2.30/gas/configure.ac	2020-04-07 13:34:03.905784046 +0100
@@ -113,6 +113,17 @@ AC_ARG_ENABLE(generate_build_notes,
   no)   ac_default_generate_build_notes=0 ;;
 esac])dnl
 
+# Decide if the x86 ELF assembler should default to generating GNU x86
+# used ISA and feature properties.
+ac_default_generate_x86_used_note=unset
+# Provide a configuration option to override the default.
+AC_ARG_ENABLE(x86-used-note,
+	      AS_HELP_STRING([--enable-x86-used-note],
+	      [generate GNU x86 used ISA and feature properties]),
+[case "${enableval}" in
+  yes)  ac_default_generate_x86_used_note=1 ;;
+  no)   ac_default_generate_x86_used_note=0 ;;
+esac])dnl
 
 using_cgen=no
 
@@ -629,6 +640,25 @@ AC_DEFINE_UNQUOTED(DEFAULT_GENERATE_BUIL
   [Define to 1 if you want to generate GNU Build attribute notes
    by default, if none are contained in the input.])
 
+if test ${ac_default_generate_x86_used_note} = unset; then
+  ac_default_generate_x86_used_note=0
+fi
+AC_DEFINE_UNQUOTED(DEFAULT_X86_USED_NOTE,
+  $ac_default_generate_x86_used_note,
+  [Define to 1 if you want to generate GNU x86 used ISA and feature
+   properties by default.])
+
+if test ${ac_default_generate_riscv_attr} = unset; then
+    case ${target_os} in
+      elf)
+	ac_default_generate_riscv_attr=1
+	;;
+      *)
+	ac_default_generate_riscv_attr=0
+	;;
+  esac
+fi
+
 if test x$ac_default_compressed_debug_sections = xyes ; then
   AC_DEFINE(DEFAULT_FLAG_COMPRESS_DEBUG, 1, [Define if you want compressed debug sections by default.])
 fi
diff -rup binutils.orig/gas/testsuite/gas/i386/i386.exp binutils-2.30/gas/testsuite/gas/i386/i386.exp
--- binutils.orig/gas/testsuite/gas/i386/i386.exp	2020-04-07 11:32:17.596774079 +0100
+++ binutils-2.30/gas/testsuite/gas/i386/i386.exp	2020-04-07 13:34:03.906784038 +0100
@@ -507,6 +507,9 @@ if [expr ([istarget "i*86-*-*"] ||  [ist
 	    run_dump_test "align-branch-3"
 	}
 
+	run_dump_test "property-1"
+	# run_dump_test "property-2"
+
 	if { [gas_64_check] } then {
 	    run_dump_test "att-regs"
 	    run_dump_test "intel-regs"
diff -rup binutils.orig/include/bfdlink.h binutils-2.30/include/bfdlink.h
--- binutils.orig/include/bfdlink.h	2020-04-07 11:32:17.506774733 +0100
+++ binutils-2.30/include/bfdlink.h	2020-04-07 13:34:03.906784038 +0100
@@ -489,6 +489,9 @@ struct bfd_link_info
   /* TRUE if GNU_PROPERTY_X86_FEATURE_1_SHSTK should be generated.  */
   unsigned int shstk: 1;
 
+  /* 0 = > no report, 1 => warn, 2=> error.  */
+  unsigned int cet_report: 2;
+
   /* TRUE if generation of .interp/PT_INTERP should be suppressed.  */
   unsigned int nointerp: 1;
 
diff -rup binutils.orig/include/elf/common.h binutils-2.30/include/elf/common.h
--- binutils.orig/include/elf/common.h	2020-04-07 11:32:17.511774697 +0100
+++ binutils-2.30/include/elf/common.h	2020-04-07 13:34:03.906784038 +0100
@@ -460,6 +460,7 @@
 #define PT_SUNW_EH_FRAME PT_GNU_EH_FRAME      /* Solaris uses the same value */
 #define PT_GNU_STACK	(PT_LOOS + 0x474e551) /* Stack flags */
 #define PT_GNU_RELRO	(PT_LOOS + 0x474e552) /* Read-only after relocation */
+#define PT_GNU_PROPERTY	(PT_LOOS + 0x474e553) /* GNU property */
 
 /* Mbind segments */
 #define PT_GNU_MBIND_NUM 4096
@@ -740,31 +741,96 @@
 /* Application-specific semantics, hi */
 #define GNU_PROPERTY_HIUSER  0xffffffff
 
-#define GNU_PROPERTY_X86_ISA_1_USED		0xc0000000
-#define GNU_PROPERTY_X86_ISA_1_NEEDED		0xc0000001
-#define GNU_PROPERTY_X86_FEATURE_1_AND		0xc0000002
-
-#define GNU_PROPERTY_X86_ISA_1_486           (1U << 0)
-#define GNU_PROPERTY_X86_ISA_1_586           (1U << 1)
-#define GNU_PROPERTY_X86_ISA_1_686           (1U << 2)
-#define GNU_PROPERTY_X86_ISA_1_SSE           (1U << 3)
-#define GNU_PROPERTY_X86_ISA_1_SSE2          (1U << 4)
-#define GNU_PROPERTY_X86_ISA_1_SSE3          (1U << 5)
-#define GNU_PROPERTY_X86_ISA_1_SSSE3         (1U << 6)
-#define GNU_PROPERTY_X86_ISA_1_SSE4_1        (1U << 7)
-#define GNU_PROPERTY_X86_ISA_1_SSE4_2        (1U << 8)
-#define GNU_PROPERTY_X86_ISA_1_AVX           (1U << 9)
-#define GNU_PROPERTY_X86_ISA_1_AVX2          (1U << 10)
-#define GNU_PROPERTY_X86_ISA_1_AVX512F       (1U << 11)
-#define GNU_PROPERTY_X86_ISA_1_AVX512CD      (1U << 12)
-#define GNU_PROPERTY_X86_ISA_1_AVX512ER      (1U << 13)
-#define GNU_PROPERTY_X86_ISA_1_AVX512PF      (1U << 14)
-#define GNU_PROPERTY_X86_ISA_1_AVX512VL      (1U << 15)
-#define GNU_PROPERTY_X86_ISA_1_AVX512DQ      (1U << 16)
-#define GNU_PROPERTY_X86_ISA_1_AVX512BW      (1U << 17)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_USED	0xc0000000
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED	0xc0000001
 
-#define GNU_PROPERTY_X86_FEATURE_1_IBT       (1U << 0)
-#define GNU_PROPERTY_X86_FEATURE_1_SHSTK     (1U << 1)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_486	(1U << 0)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_586	(1U << 1)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_686	(1U << 2)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_SSE	(1U << 3)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2	(1U << 4)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3	(1U << 5)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3	(1U << 6)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1	(1U << 7)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2	(1U << 8)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX	(1U << 9)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2	(1U << 10)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F	(1U << 11)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD	(1U << 12)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER	(1U << 13)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF	(1U << 14)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL	(1U << 15)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ	(1U << 16)
+#define GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW	(1U << 17)
+
+/* A 4-byte unsigned integer property: A bit is set if it is set in all
+   relocatable inputs.  */
+#define GNU_PROPERTY_X86_UINT32_AND_LO		0xc0000002
+#define GNU_PROPERTY_X86_UINT32_AND_HI		0xc0007fff
+
+/* A 4-byte unsigned integer property: A bit is set if it is set in any
+   relocatable inputs.  */
+#define GNU_PROPERTY_X86_UINT32_OR_LO		0xc0008000
+#define GNU_PROPERTY_X86_UINT32_OR_HI		0xc000ffff
+
+/* A 4-byte unsigned integer property: A bit is set if it is set in any
+   relocatable inputs and the property is present in all relocatable
+   inputs.  */
+#define GNU_PROPERTY_X86_UINT32_OR_AND_LO	0xc0010000
+#define GNU_PROPERTY_X86_UINT32_OR_AND_HI	0xc0017fff
+
+#define GNU_PROPERTY_X86_FEATURE_1_AND \
+  (GNU_PROPERTY_X86_UINT32_AND_LO + 0)
+
+#define GNU_PROPERTY_X86_ISA_1_NEEDED \
+  (GNU_PROPERTY_X86_UINT32_OR_LO + 0)
+#define GNU_PROPERTY_X86_FEATURE_2_NEEDED \
+  (GNU_PROPERTY_X86_UINT32_OR_LO + 1)
+
+#define GNU_PROPERTY_X86_ISA_1_USED \
+  (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 0)
+#define GNU_PROPERTY_X86_FEATURE_2_USED \
+  (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1)
+
+#define GNU_PROPERTY_X86_FEATURE_1_IBT		(1U << 0)
+#define GNU_PROPERTY_X86_FEATURE_1_SHSTK	(1U << 1)
+
+#define GNU_PROPERTY_X86_ISA_1_CMOV		(1U << 0)
+#define GNU_PROPERTY_X86_ISA_1_SSE		(1U << 1)
+#define GNU_PROPERTY_X86_ISA_1_SSE2		(1U << 2)
+#define GNU_PROPERTY_X86_ISA_1_SSE3		(1U << 3)
+#define GNU_PROPERTY_X86_ISA_1_SSSE3		(1U << 4)
+#define GNU_PROPERTY_X86_ISA_1_SSE4_1		(1U << 5)
+#define GNU_PROPERTY_X86_ISA_1_SSE4_2		(1U << 6)
+#define GNU_PROPERTY_X86_ISA_1_AVX		(1U << 7)
+#define GNU_PROPERTY_X86_ISA_1_AVX2		(1U << 8)
+#define GNU_PROPERTY_X86_ISA_1_FMA		(1U << 9)
+#define GNU_PROPERTY_X86_ISA_1_AVX512F		(1U << 10)
+#define GNU_PROPERTY_X86_ISA_1_AVX512CD		(1U << 11)
+#define GNU_PROPERTY_X86_ISA_1_AVX512ER		(1U << 12)
+#define GNU_PROPERTY_X86_ISA_1_AVX512PF		(1U << 13)
+#define GNU_PROPERTY_X86_ISA_1_AVX512VL		(1U << 14)
+#define GNU_PROPERTY_X86_ISA_1_AVX512DQ		(1U << 15)
+#define GNU_PROPERTY_X86_ISA_1_AVX512BW		(1U << 16)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS	(1U << 17)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW	(1U << 18)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_BITALG	(1U << 19)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_IFMA	(1U << 20)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_VBMI	(1U << 21)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2	(1U << 22)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_VNNI	(1U << 23)
+#define GNU_PROPERTY_X86_ISA_1_AVX512_BF16	(1U << 24)
+
+#define GNU_PROPERTY_X86_FEATURE_2_X86		(1U << 0)
+#define GNU_PROPERTY_X86_FEATURE_2_X87		(1U << 1)
+#define GNU_PROPERTY_X86_FEATURE_2_MMX		(1U << 2)
+#define GNU_PROPERTY_X86_FEATURE_2_XMM		(1U << 3)
+#define GNU_PROPERTY_X86_FEATURE_2_YMM		(1U << 4)
+#define GNU_PROPERTY_X86_FEATURE_2_ZMM		(1U << 5)
+#define GNU_PROPERTY_X86_FEATURE_2_FXSR		(1U << 6)
+#define GNU_PROPERTY_X86_FEATURE_2_XSAVE	(1U << 7)
+#define GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT	(1U << 8)
+#define GNU_PROPERTY_X86_FEATURE_2_XSAVEC	(1U << 9)
 
 /* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG).  */
 #define GNU_ABI_TAG_LINUX	0
diff -rup binutils.orig/ld/emulparams/cet.sh binutils-2.30/ld/emulparams/cet.sh
--- binutils.orig/ld/emulparams/cet.sh	2020-04-07 11:32:17.320776086 +0100
+++ binutils-2.30/ld/emulparams/cet.sh	2020-04-07 13:34:03.907784031 +0100
@@ -2,7 +2,8 @@ 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 shstk                    Generate GNU_PROPERTY_X86_FEATURE_1_SHSTK\n"));
+  -z shstk                    Generate GNU_PROPERTY_X86_FEATURE_1_SHSTK\n\
+  -z cet-report=[none|warning|error] (default: none)\n"));
 '
 PARSE_AND_LIST_ARGS_CASE_Z_CET='
       else if (strcmp (optarg, "ibtplt") == 0)
@@ -11,6 +12,18 @@ PARSE_AND_LIST_ARGS_CASE_Z_CET='
 	link_info.ibt = TRUE;
       else if (strcmp (optarg, "shstk") == 0)
 	link_info.shstk = TRUE;
+      else if (strncmp (optarg, "cet-report=", 11) == 0)
+	{
+	  if (strcmp (optarg + 11, "none") == 0)
+	    link_info.cet_report = 0;
+	  else if (strcmp (optarg + 11, "warning") == 0)
+	    link_info.cet_report = 1;
+	  else if (strcmp (optarg + 11, "error") == 0)
+	    link_info.cet_report = 2;
+	  else
+	    einfo (_("%F%P: invalid option for -z cet-report=: %s\n"),
+		   optarg + 11);
+	}
 '
 
 PARSE_AND_LIST_OPTIONS="$PARSE_AND_LIST_OPTIONS $PARSE_AND_LIST_OPTIONS_CET"
diff -rup binutils.orig/ld/testsuite/ld-elf/elf.exp binutils-2.30/ld/testsuite/ld-elf/elf.exp
--- binutils.orig/ld/testsuite/ld-elf/elf.exp	2020-04-07 11:32:17.454775112 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/elf.exp	2020-04-07 13:34:03.907784031 +0100
@@ -101,8 +101,10 @@ proc is_elf64 { binary_file } {
 
 if [is_elf64 tmpdir/symbol3w.a] {
     set ASFLAGS "$ASFLAGS --defsym ALIGN=3"
+    set pr23900_1_exp "pr23900-1-64.rd"
 } else {
     set ASFLAGS "$ASFLAGS --defsym ALIGN=2"
+    set pr23900_1_exp "pr23900-1-32.rd"
 }
 
 
@@ -317,12 +319,36 @@ if { [check_gc_sections_available] && ![
 if { [istarget *-*-*linux*]
      || [istarget *-*-nacl*]
      || [istarget *-*-gnu*] } {
-    run_ld_link_tests {
-	{"stack exec" "-z execstack" "" "" {stack.s}
-	    {{readelf {-Wl} stack-exec.rd}} "stack-exec.exe"}
-	{"stack size" "-z stack-size=0x123400" "" "" {stack.s}
-	    {{readelf {-Wl} stack-size.rd}} "stack-size.exe"}
-    }
+    run_ld_link_tests [list \
+	[list "stack exec" \
+	    "-z execstack" \
+	    "" \
+	    "" \
+	    {stack.s} \
+	    {{readelf {-Wl} stack-exec.rd}} \
+	    "stack-exec.exe"] \
+	[list "stack noexec" \
+	    "-z noexecstack" \
+	    "" \
+	    "" \
+	    {stack.s} \
+	    {{readelf {-Wl} stack-noexec.rd}} \
+	    "stack-noexec.exe"] \
+	[list "stack size" \
+	    "-z stack-size=0x123400" \
+	    "" \
+	    "" \
+	    {stack.s} \
+	    {{readelf {-Wl} stack-size.rd}} \
+	    "stack-size.exe"] \
+	[list "PT_GNU_PROPERTY alignment" \
+	    "" \
+	    "" \
+	    "" \
+	    {pr23900-1.s} \
+	    [list [list "readelf" {-Wl} $pr23900_1_exp]] \
+	    "pr23900-1.exe"] \
+	]
 }
 
 set LDFLAGS $old_ldflags
diff -rup binutils.orig/ld/testsuite/ld-i386/ibt-plt-1.d binutils-2.30/ld/testsuite/ld-i386/ibt-plt-1.d
--- binutils.orig/ld/testsuite/ld-i386/ibt-plt-1.d	2020-04-07 11:32:17.358775810 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/ibt-plt-1.d	2020-04-07 13:34:03.907784031 +0100
@@ -1,5 +1,5 @@
 #as: --32
-#ld: -shared -m elf_i386 --hash-style=sysv
+#ld: -shared -m elf_i386 --hash-style=sysv -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -7,45 +7,45 @@
 
 Disassembly of section .plt:
 
-0+1b0 <.plt>:
+[a-f0-9]+ <.plt>:
  +[a-f0-9]+:	ff b3 04 00 00 00    	pushl  0x4\(%ebx\)
  +[a-f0-9]+:	ff a3 08 00 00 00    	jmp    \*0x8\(%ebx\)
  +[a-f0-9]+:	0f 1f 40 00          	nopl   0x0\(%eax\)
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	68 00 00 00 00       	push   \$0x0
- +[a-f0-9]+:	e9 e2 ff ff ff       	jmp    1b0 <.plt>
+ +[a-f0-9]+:	e9 e2 ff ff ff       	jmp    [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	68 08 00 00 00       	push   \$0x8
- +[a-f0-9]+:	e9 d2 ff ff ff       	jmp    1b0 <.plt>
+ +[a-f0-9]+:	e9 d2 ff ff ff       	jmp    [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
 
 Disassembly of section .plt.sec:
 
-0+1e0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	ff a3 0c 00 00 00    	jmp    \*0xc\(%ebx\)
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%eax,%eax,1\)
 
-0+1f0 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	ff a3 10 00 00 00    	jmp    \*0x10\(%ebx\)
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%eax,%eax,1\)
 
 Disassembly of section .text:
 
-0+200 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	53                   	push   %ebx
- +[a-f0-9]+:	e8 18 00 00 00       	call   21e <__x86.get_pc_thunk.bx>
- +[a-f0-9]+:	81 c3 36 11 00 00    	add    \$0x1136,%ebx
+ +[a-f0-9]+:	e8 18 00 00 00       	call   [a-f0-9]+ <__x86.get_pc_thunk.bx>
+ +[a-f0-9]+:	81 c3 ([0-9a-f]{2} ){4}[ 	]+add    \$0x[a-f0-9]+,%ebx
  +[a-f0-9]+:	83 ec 08             	sub    \$0x8,%esp
- +[a-f0-9]+:	e8 dc ff ff ff       	call   1f0 <bar2@plt>
- +[a-f0-9]+:	e8 c7 ff ff ff       	call   1e0 <bar1@plt>
+ +[a-f0-9]+:	e8 dc ff ff ff       	call   [a-f0-9]+ <bar2@plt>
+ +[a-f0-9]+:	e8 c7 ff ff ff       	call   [a-f0-9]+ <bar1@plt>
  +[a-f0-9]+:	83 c4 08             	add    \$0x8,%esp
  +[a-f0-9]+:	5b                   	pop    %ebx
  +[a-f0-9]+:	c3                   	ret    
 
-0+21e <__x86.get_pc_thunk.bx>:
+[a-f0-9]+ <__x86.get_pc_thunk.bx>:
  +[a-f0-9]+:	8b 1c 24             	mov    \(%esp\),%ebx
  +[a-f0-9]+:	c3                   	ret    
 #pass
diff -rup binutils.orig/ld/testsuite/ld-i386/ibt-plt-2a.d binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2a.d
--- binutils.orig/ld/testsuite/ld-i386/ibt-plt-2a.d	2020-04-07 11:32:17.361775788 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2a.d	2020-04-07 13:34:03.907784031 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --32
-#ld: -shared -m elf_i386 -z ibtplt --hash-style=sysv
+#ld: -shared -m elf_i386 -z ibtplt --hash-style=sysv -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,45 +8,45 @@
 
 Disassembly of section .plt:
 
-0+1b0 <.plt>:
+0+1.0 <.plt>:
  +[a-f0-9]+:	ff b3 04 00 00 00    	pushl  0x4\(%ebx\)
  +[a-f0-9]+:	ff a3 08 00 00 00    	jmp    \*0x8\(%ebx\)
  +[a-f0-9]+:	0f 1f 40 00          	nopl   0x0\(%eax\)
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	68 00 00 00 00       	push   \$0x0
- +[a-f0-9]+:	e9 e2 ff ff ff       	jmp    1b0 <.plt>
+ +[a-f0-9]+:	e9 e2 ff ff ff       	jmp    1.0 <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	68 08 00 00 00       	push   \$0x8
- +[a-f0-9]+:	e9 d2 ff ff ff       	jmp    1b0 <.plt>
+ +[a-f0-9]+:	e9 d2 ff ff ff       	jmp    1.0 <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
 
 Disassembly of section .plt.sec:
 
-0+1e0 <bar1@plt>:
+0+1.0 <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	ff a3 0c 00 00 00    	jmp    \*0xc\(%ebx\)
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%eax,%eax,1\)
 
-0+1f0 <bar2@plt>:
+0+1.0 <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	ff a3 10 00 00 00    	jmp    \*0x10\(%ebx\)
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%eax,%eax,1\)
 
 Disassembly of section .text:
 
-0+200 <foo>:
+0+1.0 <foo>:
  +[a-f0-9]+:	53                   	push   %ebx
- +[a-f0-9]+:	e8 18 00 00 00       	call   21e <__x86.get_pc_thunk.bx>
- +[a-f0-9]+:	81 c3 36 11 00 00    	add    \$0x1136,%ebx
+ +[a-f0-9]+:	e8 18 00 00 00       	call   1.e <__x86.get_pc_thunk.bx>
+ +[a-f0-9]+:	81 c3 1a 11 00 00    	add    \$0x111a,%ebx
  +[a-f0-9]+:	83 ec 08             	sub    \$0x8,%esp
- +[a-f0-9]+:	e8 dc ff ff ff       	call   1f0 <bar2@plt>
- +[a-f0-9]+:	e8 c7 ff ff ff       	call   1e0 <bar1@plt>
+ +[a-f0-9]+:	e8 dc ff ff ff       	call   1.0 <bar2@plt>
+ +[a-f0-9]+:	e8 c7 ff ff ff       	call   1.0 <bar1@plt>
  +[a-f0-9]+:	83 c4 08             	add    \$0x8,%esp
  +[a-f0-9]+:	5b                   	pop    %ebx
  +[a-f0-9]+:	c3                   	ret    
 
-0+21e <__x86.get_pc_thunk.bx>:
+0+1.e <__x86.get_pc_thunk.bx>:
  +[a-f0-9]+:	8b 1c 24             	mov    \(%esp\),%ebx
  +[a-f0-9]+:	c3                   	ret    
 #pass
diff -rup binutils.orig/ld/testsuite/ld-i386/ibt-plt-2b.d binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2b.d
--- binutils.orig/ld/testsuite/ld-i386/ibt-plt-2b.d	2020-04-07 11:32:17.355775832 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2b.d	2020-04-07 13:34:03.907784031 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --32
-#ld: -shared -m elf_i386 -z ibtplt --hash-style=sysv
+#ld: -shared -m elf_i386 -z ibtplt --hash-style=sysv -z noseparate-code
 #readelf: -n -wf
 
 Contents of the .eh_frame section:
@@ -18,37 +18,31 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 0000001c 0000001c FDE cie=00000000 pc=00000200..0000021e
-  DW_CFA_advance_loc: 1 to 00000201
+0+18 0000001c 0000001c FDE cie=00000000 pc=000001.0..000001.e
+  DW_CFA_advance_loc: 1 to 000001.1
   DW_CFA_def_cfa_offset: 8
   DW_CFA_offset: r3 \(ebx\) at cfa-8
-  DW_CFA_advance_loc: 14 to 0000020f
+  DW_CFA_advance_loc: 14 to 000001.f
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 13 to 0000021c
+  DW_CFA_advance_loc: 13 to 000001.c
   DW_CFA_def_cfa_offset: 8
-  DW_CFA_advance_loc: 1 to 0000021d
+  DW_CFA_advance_loc: 1 to 000001.d
   DW_CFA_restore: r3 \(ebx\)
   DW_CFA_def_cfa_offset: 4
 
-0+38 00000010 0000003c FDE cie=00000000 pc=0000021e..00000222
+0+38 00000010 0000003c FDE cie=00000000 pc=000001.e..00000..2
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-0+4c 00000020 00000050 FDE cie=00000000 pc=000001b0..000001e0
+0+4c 00000020 00000050 FDE cie=00000000 pc=000001.0..000001.0
   DW_CFA_def_cfa_offset: 8
-  DW_CFA_advance_loc: 6 to 000001b6
+  DW_CFA_advance_loc: 6 to 000001.6
   DW_CFA_def_cfa_offset: 12
-  DW_CFA_advance_loc: 10 to 000001c0
+  DW_CFA_advance_loc: 10 to 000001.0
   DW_CFA_def_cfa_expression \(DW_OP_breg4 \(esp\): 4; DW_OP_breg8 \(eip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit9; DW_OP_ge; DW_OP_lit2; DW_OP_shl; DW_OP_plus\)
 
-0+70 00000010 00000074 FDE cie=00000000 pc=000001e0..00000200
+0+70 00000010 00000074 FDE cie=00000000 pc=000001.0..000001.0
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
-
-
-Displaying notes found in: .note.gnu.property
-  Owner                 Data size	Description
-  GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
-      Properties: x86 feature: 
diff -rup binutils.orig/ld/testsuite/ld-i386/ibt-plt-2c.d binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2c.d
--- binutils.orig/ld/testsuite/ld-i386/ibt-plt-2c.d	2020-04-07 11:32:17.357775817 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2c.d	2020-04-07 13:34:03.907784031 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --32
-#ld: -shared -m elf_i386 -z ibt --hash-style=sysv
+#ld: -shared -m elf_i386 -z ibt --hash-style=sysv -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,45 +8,45 @@
 
 Disassembly of section .plt:
 
-0+1b0 <.plt>:
+[a-f0-9]+ <.plt>:
  +[a-f0-9]+:	ff b3 04 00 00 00    	pushl  0x4\(%ebx\)
  +[a-f0-9]+:	ff a3 08 00 00 00    	jmp    \*0x8\(%ebx\)
  +[a-f0-9]+:	0f 1f 40 00          	nopl   0x0\(%eax\)
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	68 00 00 00 00       	push   \$0x0
- +[a-f0-9]+:	e9 e2 ff ff ff       	jmp    1b0 <.plt>
+ +[a-f0-9]+:	e9 e2 ff ff ff       	jmp    [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	68 08 00 00 00       	push   \$0x8
- +[a-f0-9]+:	e9 d2 ff ff ff       	jmp    1b0 <.plt>
+ +[a-f0-9]+:	e9 d2 ff ff ff       	jmp    [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
 
 Disassembly of section .plt.sec:
 
-0+1e0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	ff a3 0c 00 00 00    	jmp    \*0xc\(%ebx\)
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%eax,%eax,1\)
 
-0+1f0 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
  +[a-f0-9]+:	ff a3 10 00 00 00    	jmp    \*0x10\(%ebx\)
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%eax,%eax,1\)
 
 Disassembly of section .text:
 
-0+200 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	53                   	push   %ebx
- +[a-f0-9]+:	e8 18 00 00 00       	call   21e <__x86.get_pc_thunk.bx>
- +[a-f0-9]+:	81 c3 36 11 00 00    	add    \$0x1136,%ebx
+ +[a-f0-9]+:	e8 18 00 00 00       	call   [0-9a-f]+ <__x86.get_pc_thunk.bx>
+ +[a-f0-9]+:	81 c3 ([0-9a-f]{2} ){4}[ 	]+add    \$0x[a-f0-9]+,%ebx
  +[a-f0-9]+:	83 ec 08             	sub    \$0x8,%esp
- +[a-f0-9]+:	e8 dc ff ff ff       	call   1f0 <bar2@plt>
- +[a-f0-9]+:	e8 c7 ff ff ff       	call   1e0 <bar1@plt>
+ +[a-f0-9]+:	e8 dc ff ff ff       	call   [a-f0-9]+ <bar2@plt>
+ +[a-f0-9]+:	e8 c7 ff ff ff       	call   [a-f0-9]+ <bar1@plt>
  +[a-f0-9]+:	83 c4 08             	add    \$0x8,%esp
  +[a-f0-9]+:	5b                   	pop    %ebx
  +[a-f0-9]+:	c3                   	ret    
 
-0+21e <__x86.get_pc_thunk.bx>:
+[a-f0-9]+ <__x86.get_pc_thunk.bx>:
  +[a-f0-9]+:	8b 1c 24             	mov    \(%esp\),%ebx
  +[a-f0-9]+:	c3                   	ret    
 #pass
diff -rup binutils.orig/ld/testsuite/ld-i386/ibt-plt-2d.d binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2d.d
--- binutils.orig/ld/testsuite/ld-i386/ibt-plt-2d.d	2020-04-07 11:32:17.354775839 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/ibt-plt-2d.d	2020-04-07 13:34:03.907784031 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --32
-#ld: -shared -m elf_i386 -z ibt --hash-style=sysv
+#ld: -shared -m elf_i386 -z ibt --hash-style=sysv -z noseparate-code
 #readelf: -n -wf
 
 Contents of the .eh_frame section:
@@ -18,31 +18,31 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 0000001c 0000001c FDE cie=00000000 pc=00000200..0000021e
-  DW_CFA_advance_loc: 1 to 00000201
+0+18 0000001c 0000001c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
+  DW_CFA_advance_loc: 1 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
   DW_CFA_offset: r3 \(ebx\) at cfa-8
-  DW_CFA_advance_loc: 14 to 0000020f
+  DW_CFA_advance_loc: 14 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 13 to 0000021c
+  DW_CFA_advance_loc: 13 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
-  DW_CFA_advance_loc: 1 to 0000021d
+  DW_CFA_advance_loc: 1 to [a-f0-9]+
   DW_CFA_restore: r3 \(ebx\)
   DW_CFA_def_cfa_offset: 4
 
-0+38 00000010 0000003c FDE cie=00000000 pc=0000021e..00000222
+0+38 00000010 0000003c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-0+4c 00000020 00000050 FDE cie=00000000 pc=000001b0..000001e0
+0+4c 00000020 00000050 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_def_cfa_offset: 8
-  DW_CFA_advance_loc: 6 to 000001b6
+  DW_CFA_advance_loc: 6 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 12
-  DW_CFA_advance_loc: 10 to 000001c0
+  DW_CFA_advance_loc: 10 to [a-f0-9]+
   DW_CFA_def_cfa_expression \(DW_OP_breg4 \(esp\): 4; DW_OP_breg8 \(eip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit9; DW_OP_ge; DW_OP_lit2; DW_OP_shl; DW_OP_plus\)
 
-0+70 00000010 00000074 FDE cie=00000000 pc=000001e0..00000200
+0+70 00000010 00000074 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
diff -rup binutils.orig/ld/testsuite/ld-i386/ibt-plt-3d.d binutils-2.30/ld/testsuite/ld-i386/ibt-plt-3d.d
--- binutils.orig/ld/testsuite/ld-i386/ibt-plt-3d.d	2020-04-07 11:32:17.364775766 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/ibt-plt-3d.d	2020-04-07 13:34:03.907784031 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-3.s
 #as: --32
-#ld: -shared -m elf_i386 -z ibt --hash-style=sysv
+#ld: -shared -m elf_i386 -z ibt --hash-style=sysv -z noseparate-code
 #readelf: -wf -n
 
 Contents of the .eh_frame section:
@@ -18,31 +18,31 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 0000001c 0000001c FDE cie=00000000 pc=00000200..0000021e
-  DW_CFA_advance_loc: 1 to 00000201
+0+18 0000001c 0000001c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
+  DW_CFA_advance_loc: 1 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
   DW_CFA_offset: r3 \(ebx\) at cfa-8
-  DW_CFA_advance_loc: 14 to 0000020f
+  DW_CFA_advance_loc: 14 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 13 to 0000021c
+  DW_CFA_advance_loc: 13 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
-  DW_CFA_advance_loc: 1 to 0000021d
+  DW_CFA_advance_loc: 1 to [a-f0-9]+
   DW_CFA_restore: r3 \(ebx\)
   DW_CFA_def_cfa_offset: 4
 
-0+38 00000010 0000003c FDE cie=00000000 pc=0000021e..00000222
+0+38 00000010 0000003c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-0+4c 00000020 00000050 FDE cie=00000000 pc=000001b0..000001e0
+0+4c 00000020 00000050 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_def_cfa_offset: 8
-  DW_CFA_advance_loc: 6 to 000001b6
+  DW_CFA_advance_loc: 6 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 12
-  DW_CFA_advance_loc: 10 to 000001c0
+  DW_CFA_advance_loc: 10 to [a-f0-9]+
   DW_CFA_def_cfa_expression \(DW_OP_breg4 \(esp\): 4; DW_OP_breg8 \(eip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit9; DW_OP_ge; DW_OP_lit2; DW_OP_shl; DW_OP_plus\)
 
-0+70 00000010 00000074 FDE cie=00000000 pc=000001e0..00000200
+0+70 00000010 00000074 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
diff -rup binutils.orig/ld/testsuite/ld-i386/pr23372a.d binutils-2.30/ld/testsuite/ld-i386/pr23372a.d
--- binutils.orig/ld/testsuite/ld-i386/pr23372a.d	2020-04-07 11:32:17.357775817 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/pr23372a.d	2020-04-07 13:34:03.907784031 +0100
@@ -3,3 +3,8 @@
 #as: --32
 #ld: -r -m elf_i386
 #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 ISA used: 
diff -rup binutils.orig/ld/testsuite/ld-i386/property-x86-ibt3a.d binutils-2.30/ld/testsuite/ld-i386/property-x86-ibt3a.d
--- binutils.orig/ld/testsuite/ld-i386/property-x86-ibt3a.d	2020-04-07 11:32:17.358775810 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/property-x86-ibt3a.d	2020-04-07 13:34:03.907784031 +0100
@@ -6,6 +6,5 @@
 
 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
+  GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
diff -rup binutils.orig/ld/testsuite/ld-i386/property-x86-ibt3b.d binutils-2.30/ld/testsuite/ld-i386/property-x86-ibt3b.d
--- binutils.orig/ld/testsuite/ld-i386/property-x86-ibt3b.d	2020-04-07 11:32:17.353775846 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/property-x86-ibt3b.d	2020-04-07 13:34:03.908784024 +0100
@@ -6,6 +6,5 @@
 
 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
+  GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
diff -rup binutils.orig/ld/testsuite/ld-i386/property-x86-shstk3a.d binutils-2.30/ld/testsuite/ld-i386/property-x86-shstk3a.d
--- binutils.orig/ld/testsuite/ld-i386/property-x86-shstk3a.d	2020-04-07 11:32:17.355775832 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/property-x86-shstk3a.d	2020-04-07 13:34:03.908784024 +0100
@@ -6,6 +6,5 @@
 
 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
+  GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
diff -rup binutils.orig/ld/testsuite/ld-i386/property-x86-shstk3b.d binutils-2.30/ld/testsuite/ld-i386/property-x86-shstk3b.d
--- binutils.orig/ld/testsuite/ld-i386/property-x86-shstk3b.d	2020-04-07 11:32:17.362775781 +0100
+++ binutils-2.30/ld/testsuite/ld-i386/property-x86-shstk3b.d	2020-04-07 13:34:03.908784024 +0100
@@ -6,6 +6,5 @@
 
 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
+  GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-1-x32.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-1-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-1-x32.d	2020-04-07 11:32:17.432775271 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-1-x32.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-1.s
 #as: --x32
-#ld: -shared -m elf32_x86_64 --hash-style=sysv
+#ld: -shared -m elf32_x86_64 --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+1c0 <.plt>:
- +[a-f0-9]+:	ff 35 62 01 20 00    	pushq  0x200162\(%rip\)        # 200328 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	ff 25 64 01 20 00    	jmpq   \*0x200164\(%rip\)        # 200330 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+ <.plt>:
+ +[a-f0-9]+:	ff 35 ([0-9a-f]{2} ){4}[ 	]+pushq  0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 40 00          	nopl   0x0\(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
 
 Disassembly of section .plt.sec:
 
-0+1f0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 3e 01 20 00    	jmpq   \*0x20013e\(%rip\)        # 200338 <bar1>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar1>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
-0+200 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 36 01 20 00    	jmpq   \*0x200136\(%rip\)        # 200340 <bar2>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar2>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+210 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  200 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  [a-f0-9]+ <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   1f0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   [a-f0-9]+ <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-1.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-1.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-1.d	2020-04-07 11:32:17.431775279 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-1.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-1.s
 #as: --64 -defsym __64_bit__=1
-#ld: -shared -m elf_x86_64 --hash-style=sysv
+#ld: -shared -m elf_x86_64 --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+290 <.plt>:
- +[a-f0-9]+:	ff 35 ea 01 20 00    	pushq  0x2001ea\(%rip\)        # 200480 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	f2 ff 25 eb 01 20 00 	bnd jmpq \*0x2001eb\(%rip\)        # 200488 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+ <.plt>:
+ +[a-f0-9]+:	ff 35 ([0-9a-f]{2} ){4}[ 	]+pushq  0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 00             	nopl   \(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq [a-f0-9]+ <.plt>
  +[a-f0-9]+:	90                   	nop
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq [a-f0-9]+ <.plt>
  +[a-f0-9]+:	90                   	nop
 
 Disassembly of section .plt.sec:
 
-0+2c0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 c5 01 20 00 	bnd jmpq \*0x2001c5\(%rip\)        # 200490 <bar1>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar1>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
-0+2d0 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 bd 01 20 00 	bnd jmpq \*0x2001bd\(%rip\)        # 200498 <bar2>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar2>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+2e0 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  2d0 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  [a-f0-9]+ <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   2c0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   [a-f0-9]+ <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2a-x32.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2a-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2a-x32.d	2020-04-07 11:32:17.427775308 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2a-x32.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --x32
-#ld: -shared -m elf32_x86_64 -z ibtplt --hash-style=sysv
+#ld: -shared -m elf32_x86_64 -z ibtplt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+1c0 <.plt>:
- +[a-f0-9]+:	ff 35 62 01 20 00    	pushq  0x200162\(%rip\)        # 200328 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	ff 25 64 01 20 00    	jmpq   \*0x200164\(%rip\)        # 200330 <_GLOBAL_OFFSET_TABLE_\+0x10>
+0+1.0 <.plt>:
+ +[a-f0-9]+:	ff 35 4a 01 20 00    	pushq  0x20014a\(%rip\)        # 200... <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	ff 25 4c 01 20 00    	jmpq   \*0x20014c\(%rip\)        # 200... <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 40 00          	nopl   0x0\(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   1.0 <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   1.0 <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
 
 Disassembly of section .plt.sec:
 
-0+1f0 <bar1@plt>:
+0+1.0 <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 3e 01 20 00    	jmpq   \*0x20013e\(%rip\)        # 200338 <bar1>
+ +[a-f0-9]+:	ff 25 26 01 20 00    	jmpq   \*0x200126\(%rip\)        # 200... <bar1>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
-0+200 <bar2@plt>:
+0+1.0 <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 36 01 20 00    	jmpq   \*0x200136\(%rip\)        # 200340 <bar2>
+ +[a-f0-9]+:	ff 25 1e 01 20 00    	jmpq   \*0x20011e\(%rip\)        # 200... <bar2>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+210 <foo>:
+0+1.0 <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  200 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  1.0 <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   1f0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   1.0 <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2a.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2a.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2a.d	2020-04-07 11:32:17.434775257 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2a.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --64 -defsym __64_bit__=1
-#ld: -shared -m elf_x86_64 -z ibtplt --hash-style=sysv
+#ld: -shared -m elf_x86_64 -z ibtplt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+290 <.plt>:
- +[a-f0-9]+:	ff 35 ea 01 20 00    	pushq  0x2001ea\(%rip\)        # 200480 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	f2 ff 25 eb 01 20 00 	bnd jmpq \*0x2001eb\(%rip\)        # 200488 <_GLOBAL_OFFSET_TABLE_\+0x10>
+0+..0 <.plt>:
+ +[a-f0-9]+:	ff 35 ca 01 20 00    	pushq  0x2001ca\(%rip\)        # 200... <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	f2 ff 25 cb 01 20 00 	bnd jmpq \*0x2001cb\(%rip\)        # 200... <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 00             	nopl   \(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq ..0 <.plt>
  +[a-f0-9]+:	90                   	nop
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq ..0 <.plt>
  +[a-f0-9]+:	90                   	nop
 
 Disassembly of section .plt.sec:
 
-0+2c0 <bar1@plt>:
+0+..0 <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 c5 01 20 00 	bnd jmpq \*0x2001c5\(%rip\)        # 200490 <bar1>
+ +[a-f0-9]+:	f2 ff 25 a5 01 20 00 	bnd jmpq \*0x2001a5\(%rip\)        # 200... <bar1>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
-0+2d0 <bar2@plt>:
+0+..0 <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 bd 01 20 00 	bnd jmpq \*0x2001bd\(%rip\)        # 200498 <bar2>
+ +[a-f0-9]+:	f2 ff 25 9d 01 20 00 	bnd jmpq \*0x20019d\(%rip\)        # 200... <bar2>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+2e0 <foo>:
+0+..0 <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  2d0 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  ..0 <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   2c0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   ..0 <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2b-x32.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2b-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2b-x32.d	2020-04-07 11:32:17.432775271 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2b-x32.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --x32
-#ld: -shared -m elf32_x86_64 -z ibtplt --hash-style=sysv
+#ld: -shared -m elf32_x86_64 -z ibtplt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #readelf: -n -wf
 
 Contents of the .eh_frame section:
@@ -18,27 +18,21 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 00000014 0000001c FDE cie=00000000 pc=00000210..00000222
-  DW_CFA_advance_loc: 4 to 00000214
+0+18 00000014 0000001c FDE cie=00000000 pc=00000..0..00000..2
+  DW_CFA_advance_loc: 4 to 00000..4
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 9 to 0000021d
+  DW_CFA_advance_loc: 9 to 00000..d
   DW_CFA_def_cfa_offset: 8
   DW_CFA_nop
 
-0+30 00000020 00000034 FDE cie=00000000 pc=000001c0..000001f0
+0+30 00000020 00000034 FDE cie=00000000 pc=00000..0..00000..0
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 6 to 000001c6
+  DW_CFA_advance_loc: 6 to 00000..6
   DW_CFA_def_cfa_offset: 24
-  DW_CFA_advance_loc: 10 to 000001d0
+  DW_CFA_advance_loc: 10 to 00000..0
   DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit9; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus\)
 
-0+54 00000010 00000058 FDE cie=00000000 pc=000001f0..00000210
+0+54 00000010 00000058 FDE cie=00000000 pc=00000..0..00000..0
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
-
-
-Displaying notes found in: .note.gnu.property
-  Owner                 Data size	Description
-  GNU                  0x0000000c	NT_GNU_PROPERTY_TYPE_0
-      Properties: x86 feature: 
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2b.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2b.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2b.d	2020-04-07 11:32:17.427775308 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2b.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --64 -defsym __64_bit__=1
-#ld: -shared -m elf_x86_64 -z ibtplt --hash-style=sysv
+#ld: -shared -m elf_x86_64 -z ibtplt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #readelf: -wf -n
 
 Contents of the .eh_frame section:
@@ -18,31 +18,25 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 0000000000000014 0000001c FDE cie=00000000 pc=00000000000002e0..00000000000002f2
-  DW_CFA_advance_loc: 4 to 00000000000002e4
+0+18 0000000000000014 0000001c FDE cie=00000000 pc=0000000000000..0..0000000000000..2
+  DW_CFA_advance_loc: 4 to 0000000000000..4
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 9 to 00000000000002ed
+  DW_CFA_advance_loc: 9 to 0000000000000..d
   DW_CFA_def_cfa_offset: 8
   DW_CFA_nop
 
-0+30 0000000000000024 00000034 FDE cie=00000000 pc=0000000000000290..00000000000002c0
+0+30 0000000000000024 00000034 FDE cie=00000000 pc=0000000000000..0..0000000000000..0
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 6 to 0000000000000296
+  DW_CFA_advance_loc: 6 to 0000000000000..6
   DW_CFA_def_cfa_offset: 24
-  DW_CFA_advance_loc: 10 to 00000000000002a0
+  DW_CFA_advance_loc: 10 to 0000000000000..0
   DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit10; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus\)
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-0+58 0000000000000010 0000005c FDE cie=00000000 pc=00000000000002c0..00000000000002e0
+0+58 0000000000000010 0000005c FDE cie=00000000 pc=0000000000000..0..0000000000000..0
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
-
-
-Displaying notes found in: .note.gnu.property
-  Owner                 Data size	Description
-  GNU                  0x00000010	NT_GNU_PROPERTY_TYPE_0
-      Properties: x86 feature: 
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2c-x32.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2c-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2c-x32.d	2020-04-07 11:32:17.429775293 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2c-x32.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --x32
-#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+1c0 <.plt>:
- +[a-f0-9]+:	ff 35 62 01 20 00    	pushq  0x200162\(%rip\)        # 200328 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	ff 25 64 01 20 00    	jmpq   \*0x200164\(%rip\)        # 200330 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+ <.plt>:
+ +[a-f0-9]+:	ff 35 ([0-9a-f]{2} ){4}[ 	]+pushq  0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 40 00          	nopl   0x0\(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
 
 Disassembly of section .plt.sec:
 
-0+1f0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 3e 01 20 00    	jmpq   \*0x20013e\(%rip\)        # 200338 <bar1>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar1>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
-0+200 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 36 01 20 00    	jmpq   \*0x200136\(%rip\)        # 200340 <bar2>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar2>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+210 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  200 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  [a-f0-9]+ <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   1f0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   [a-f0-9]+ <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2c.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2c.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2c.d	2020-04-07 11:32:17.429775293 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2c.d	2020-04-07 13:34:03.908784024 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --64 -defsym __64_bit__=1
-#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+290 <.plt>:
- +[a-f0-9]+:	ff 35 ea 01 20 00    	pushq  0x2001ea\(%rip\)        # 200480 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	f2 ff 25 eb 01 20 00 	bnd jmpq \*0x2001eb\(%rip\)        # 200488 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+ <.plt>:
+ +[a-f0-9]+:	ff 35 ([0-9a-f]{2} ){4}[ 	]+pushq  0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 00             	nopl   \(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq [a-f0-9]+ <.plt>
  +[a-f0-9]+:	90                   	nop
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq [a-f0-9]+ <.plt>
  +[a-f0-9]+:	90                   	nop
 
 Disassembly of section .plt.sec:
 
-0+2c0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 c5 01 20 00 	bnd jmpq \*0x2001c5\(%rip\)        # 200490 <bar1>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar1>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
-0+2d0 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 bd 01 20 00 	bnd jmpq \*0x2001bd\(%rip\)        # 200498 <bar2>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar2>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+2e0 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  2d0 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  [a-f0-9]+ <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   2c0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   [a-f0-9]+ <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2d-x32.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2d-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2d-x32.d	2020-04-07 11:32:17.423775337 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2d-x32.d	2020-04-07 13:34:03.909784017 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --x32
-#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #readelf: -n -wf
 
 Contents of the .eh_frame section:
@@ -18,21 +18,21 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 00000014 0000001c FDE cie=00000000 pc=00000210..00000222
-  DW_CFA_advance_loc: 4 to 00000214
+0+18 00000014 0000001c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
+  DW_CFA_advance_loc: 4 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 9 to 0000021d
+  DW_CFA_advance_loc: 9 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
   DW_CFA_nop
 
-0+30 00000020 00000034 FDE cie=00000000 pc=000001c0..000001f0
+0+30 00000020 00000034 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 6 to 000001c6
+  DW_CFA_advance_loc: 6 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 24
-  DW_CFA_advance_loc: 10 to 000001d0
+  DW_CFA_advance_loc: 10 to [a-f0-9]+
   DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit9; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus\)
 
-0+54 00000010 00000058 FDE cie=00000000 pc=000001f0..00000210
+0+54 00000010 00000058 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2d.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2d.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-2d.d	2020-04-07 11:32:17.425775323 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-2d.d	2020-04-07 13:34:03.909784017 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-2.s
 #as: --64 -defsym __64_bit__=1
-#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #readelf: -wf -n
 
 Contents of the .eh_frame section:
@@ -18,25 +18,25 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 0000000000000014 0000001c FDE cie=00000000 pc=00000000000002e0..00000000000002f2
-  DW_CFA_advance_loc: 4 to 00000000000002e4
+0+18 0000000000000014 0000001c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
+  DW_CFA_advance_loc: 4 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 9 to 00000000000002ed
+  DW_CFA_advance_loc: 9 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
   DW_CFA_nop
 
-0+30 0000000000000024 00000034 FDE cie=00000000 pc=0000000000000290..00000000000002c0
+0+30 0000000000000024 00000034 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 6 to 0000000000000296
+  DW_CFA_advance_loc: 6 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 24
-  DW_CFA_advance_loc: 10 to 00000000000002a0
+  DW_CFA_advance_loc: 10 to [a-f0-9]+
   DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit10; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus\)
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-0+58 0000000000000010 0000005c FDE cie=00000000 pc=00000000000002c0..00000000000002e0
+0+58 0000000000000010 0000005c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
@@ -46,3 +46,4 @@ Displaying notes found in: .note.gnu.pro
   Owner                 Data size	Description
   GNU                  0x00000010	NT_GNU_PROPERTY_TYPE_0
       Properties: x86 feature: IBT
+#pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3c-x32.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3c-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3c-x32.d	2020-04-07 11:32:17.428775301 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3c-x32.d	2020-04-07 13:34:03.909784017 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-3.s
 #as: --x32
-#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+1c0 <.plt>:
- +[a-f0-9]+:	ff 35 62 01 20 00    	pushq  0x200162\(%rip\)        # 200328 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	ff 25 64 01 20 00    	jmpq   \*0x200164\(%rip\)        # 200330 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+ <.plt>:
+ +[a-f0-9]+:	ff 35 ([0-9a-f]{2} ){4}[ 	]+pushq  0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 40 00          	nopl   0x0\(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 e2 ff ff ff       	jmpq   [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   1c0 <.plt>
+ +[a-f0-9]+:	e9 d2 ff ff ff       	jmpq   [a-f0-9]+ <.plt>
  +[a-f0-9]+:	66 90                	xchg   %ax,%ax
 
 Disassembly of section .plt.sec:
 
-0+1f0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 3e 01 20 00    	jmpq   \*0x20013e\(%rip\)        # 200338 <bar1>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar1>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
-0+200 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	ff 25 36 01 20 00    	jmpq   \*0x200136\(%rip\)        # 200340 <bar2>
+ +[a-f0-9]+:	ff 25 ([0-9a-f]{2} ){4}[ 	]+jmpq   \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar2>
  +[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+210 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  200 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  [a-f0-9]+ <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   1f0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   [a-f0-9]+ <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3c.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3c.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3c.d	2020-04-07 11:32:17.435775250 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3c.d	2020-04-07 13:34:03.909784017 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-3.s
 #as: --64 -defsym __64_bit__=1
-#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #objdump: -dw
 
 .*: +file format .*
@@ -8,36 +8,36 @@
 
 Disassembly of section .plt:
 
-0+290 <.plt>:
- +[a-f0-9]+:	ff 35 ea 01 20 00    	pushq  0x2001ea\(%rip\)        # 200480 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+:	f2 ff 25 eb 01 20 00 	bnd jmpq \*0x2001eb\(%rip\)        # 200488 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+ <.plt>:
+ +[a-f0-9]+:	ff 35 ([0-9a-f]{2} ){4}[ 	]+pushq  0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <_GLOBAL_OFFSET_TABLE_\+0x10>
  +[a-f0-9]+:	0f 1f 00             	nopl   \(%rax\)
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 00 00 00 00       	pushq  \$0x0
- +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 e1 ff ff ff    	bnd jmpq [a-f0-9]+ <.plt>
  +[a-f0-9]+:	90                   	nop
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
  +[a-f0-9]+:	68 01 00 00 00       	pushq  \$0x1
- +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq 290 <.plt>
+ +[a-f0-9]+:	f2 e9 d1 ff ff ff    	bnd jmpq [a-f0-9]+ <.plt>
  +[a-f0-9]+:	90                   	nop
 
 Disassembly of section .plt.sec:
 
-0+2c0 <bar1@plt>:
+[a-f0-9]+ <bar1@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 c5 01 20 00 	bnd jmpq \*0x2001c5\(%rip\)        # 200490 <bar1>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar1>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
-0+2d0 <bar2@plt>:
+[a-f0-9]+ <bar2@plt>:
  +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
- +[a-f0-9]+:	f2 ff 25 bd 01 20 00 	bnd jmpq \*0x2001bd\(%rip\)        # 200498 <bar2>
+ +[a-f0-9]+:	f2 ff 25 ([0-9a-f]{2} ){4}[ 	]+bnd jmpq \*0x[a-f0-9]+\(%rip\)        # [a-f0-9]+ <bar2>
  +[a-f0-9]+:	0f 1f 44 00 00       	nopl   0x0\(%rax,%rax,1\)
 
 Disassembly of section .text:
 
-0+2e0 <foo>:
+[a-f0-9]+ <foo>:
  +[a-f0-9]+:	48 83 ec 08          	sub    \$0x8,%rsp
- +[a-f0-9]+:	e8 e7 ff ff ff       	callq  2d0 <bar2@plt>
+ +[a-f0-9]+:	e8 e7 ff ff ff       	callq  [a-f0-9]+ <bar2@plt>
  +[a-f0-9]+:	48 83 c4 08          	add    \$0x8,%rsp
- +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   2c0 <bar1@plt>
+ +[a-f0-9]+:	e9 ce ff ff ff       	jmpq   [a-f0-9]+ <bar1@plt>
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3d-x32.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3d-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3d-x32.d	2020-04-07 11:32:17.433775264 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3d-x32.d	2020-04-07 13:34:03.909784017 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-3.s
 #as: --x32
-#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf32_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #readelf: -wf -n
 
 Contents of the .eh_frame section:
@@ -18,21 +18,21 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 00000014 0000001c FDE cie=00000000 pc=00000210..00000222
-  DW_CFA_advance_loc: 4 to 00000214
+0+18 00000014 0000001c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
+  DW_CFA_advance_loc: 4 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 9 to 0000021d
+  DW_CFA_advance_loc: 9 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
   DW_CFA_nop
 
-0+30 00000020 00000034 FDE cie=00000000 pc=000001c0..000001f0
+0+30 00000020 00000034 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 6 to 000001c6
+  DW_CFA_advance_loc: 6 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 24
-  DW_CFA_advance_loc: 10 to 000001d0
+  DW_CFA_advance_loc: 10 to [a-f0-9]+
   DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit9; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus\)
 
-0+54 00000010 00000058 FDE cie=00000000 pc=000001f0..00000210
+0+54 00000010 00000058 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
diff -rup binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3d.d binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3d.d
--- binutils.orig/ld/testsuite/ld-x86-64/ibt-plt-3d.d	2020-04-07 11:32:17.438775228 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/ibt-plt-3d.d	2020-04-07 13:34:03.909784017 +0100
@@ -1,6 +1,6 @@
 #source: ibt-plt-3.s
 #as: --64 -defsym __64_bit__=1
-#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv
+#ld: -shared -m elf_x86_64 -z ibt --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
 #readelf: -wf -n
 
 Contents of the .eh_frame section:
@@ -18,25 +18,25 @@ Contents of the .eh_frame section:
   DW_CFA_nop
   DW_CFA_nop
 
-0+18 0000000000000014 0000001c FDE cie=00000000 pc=00000000000002e0..00000000000002f2
-  DW_CFA_advance_loc: 4 to 00000000000002e4
+0+18 0000000000000014 0000001c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
+  DW_CFA_advance_loc: 4 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 9 to 00000000000002ed
+  DW_CFA_advance_loc: 9 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 8
   DW_CFA_nop
 
-0+30 0000000000000024 00000034 FDE cie=00000000 pc=0000000000000290..00000000000002c0
+0+30 0000000000000024 00000034 FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_def_cfa_offset: 16
-  DW_CFA_advance_loc: 6 to 0000000000000296
+  DW_CFA_advance_loc: 6 to [a-f0-9]+
   DW_CFA_def_cfa_offset: 24
-  DW_CFA_advance_loc: 10 to 00000000000002a0
+  DW_CFA_advance_loc: 10 to [a-f0-9]+
   DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit10; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus\)
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
 
-0+58 0000000000000010 0000005c FDE cie=00000000 pc=00000000000002c0..00000000000002e0
+0+58 0000000000000010 0000005c FDE cie=00000000 pc=[a-f0-9]+\.\.[a-f0-9]+
   DW_CFA_nop
   DW_CFA_nop
   DW_CFA_nop
diff -rup binutils.orig/ld/testsuite/ld-x86-64/pr23372a-x32.d binutils-2.30/ld/testsuite/ld-x86-64/pr23372a-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/pr23372a-x32.d	2020-04-07 11:32:17.435775250 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/pr23372a-x32.d	2020-04-07 13:34:03.909784017 +0100
@@ -3,3 +3,8 @@
 #as: --x32
 #ld: -r -m elf32_x86_64
 #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 ISA used: 
diff -rup binutils.orig/ld/testsuite/ld-x86-64/pr23372a.d binutils-2.30/ld/testsuite/ld-x86-64/pr23372a.d
--- binutils.orig/ld/testsuite/ld-x86-64/pr23372a.d	2020-04-07 11:32:17.439775221 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/pr23372a.d	2020-04-07 13:34:03.909784017 +0100
@@ -3,3 +3,8 @@
 #as: --64 -defsym __64_bit__=1
 #ld: -r -m elf_x86_64
 #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 ISA used: 
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-3.r binutils-2.30/ld/testsuite/ld-x86-64/property-3.r
--- binutils.orig/ld/testsuite/ld-x86-64/property-3.r	2020-04-07 11:32:17.423775337 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-3.r	2020-04-07 13:34:03.909784017 +0100
@@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.pro
   Owner                 Data size	Description
   GNU                  0x[0-9a-f]+	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x800000
-	x86 ISA used: 586, SSE
 	x86 ISA needed: i486, 586
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-4.r binutils-2.30/ld/testsuite/ld-x86-64/property-4.r
--- binutils.orig/ld/testsuite/ld-x86-64/property-4.r	2020-04-07 11:32:17.427775308 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-4.r	2020-04-07 13:34:03.909784017 +0100
@@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.pro
   Owner                 Data size	Description
   GNU                  0x[0-9a-f]+	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x800000
-	x86 ISA used: i486, 586, SSE
 	x86 ISA needed: i486, 586, SSE
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-5.r binutils-2.30/ld/testsuite/ld-x86-64/property-5.r
--- binutils.orig/ld/testsuite/ld-x86-64/property-5.r	2020-04-07 11:32:17.437775235 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-5.r	2020-04-07 13:34:03.909784017 +0100
@@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.pro
   Owner                 Data size	Description
   GNU                  0x[0-9a-f]+	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x900000
-	x86 ISA used: i486, 586, SSE
 	x86 ISA needed: i486, 586, SSE
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d	2020-04-07 11:32:17.429775293 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-3.s
 #source: property-x86-ibt.s
-#as: --x32
+#as: --x32 -mx86-used-note=yes
 #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
+  GNU                  0x00000024	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3a.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3a.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3a.d	2020-04-07 11:32:17.431775279 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3a.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-3.s
 #source: property-x86-ibt.s
-#as: --64 -defsym __64_bit__=1
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
 #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
+  GNU                  0x00000030	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d	2020-04-07 11:32:17.427775308 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-ibt.s
 #source: property-x86-3.s
-#as: --x32
+#as: --x32 -mx86-used-note=yes
 #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
+  GNU                  0x00000024	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3b.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3b.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-ibt3b.d	2020-04-07 11:32:17.423775337 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-ibt3b.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-ibt.s
 #source: property-x86-3.s
-#as: --64 -defsym __64_bit__=1
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
 #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
+  GNU                  0x00000030	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d	2020-04-07 11:32:17.425775323 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-3.s
 #source: property-x86-shstk.s
-#as: --x32
+#as: --x32 -mx86-used-note=yes
 #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
+  GNU                  0x00000024	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3a.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3a.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3a.d	2020-04-07 11:32:17.427775308 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3a.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-3.s
 #source: property-x86-shstk.s
-#as: --64 -defsym __64_bit__=1
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
 #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
+  GNU                  0x00000030	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d	2020-04-07 11:32:17.423775337 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-shstk.s
 #source: property-x86-3.s
-#as: --x32
+#as: --x32 -mx86-used-note=yes
 #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
+  GNU                  0x00000024	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3b.d binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3b.d
--- binutils.orig/ld/testsuite/ld-x86-64/property-x86-shstk3b.d	2020-04-07 11:32:17.436775242 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-x86-shstk3b.d	2020-04-07 13:34:03.910784010 +0100
@@ -1,11 +1,12 @@
 #source: property-x86-shstk.s
 #source: property-x86-3.s
-#as: --64 -defsym __64_bit__=1
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
 #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
+  GNU                  0x00000030	NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA needed: i486, 586, SSE2, SSE3
+	x86 ISA used: <None>
+	x86 feature used: x86
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/gas/testsuite/gas/i386/property-1.s	2020-08-20 15:44:27.696983474 +0100
@@ -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 0xc0010000	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/gas/testsuite/gas/i386/property-1.d	2020-08-20 15:44:27.696983474 +0100
@@ -0,0 +1,8 @@
+#name: i386 property 1
+#as: -mx86-used-note=no --generate-missing-build-notes=no
+#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 ISA used: <None>
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/gas/testsuite/gas/i386/property-2.d	2020-08-20 15:44:34.770964195 +0100
@@ -0,0 +1,9 @@
+#name: i386 property 2
+#as: -mx86-used-note=yes --generate-missing-build-notes=no
+#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 ISA used: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD, AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, AVX512_4FMAPS, AVX512_4VNNIW, AVX512_BITALG, AVX512_IFMA, AVX512_VBMI, AVX512_VBMI2, AVX512_VNNI, AVX512_BF16
+	x86 feature used: x86, x87, MMX, XMM, YMM, ZMM, FXSR, XSAVE, XSAVEOPT, XSAVEC
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/gas/testsuite/gas/i386/property-2.s	2020-08-20 15:44:34.770964195 +0100
@@ -0,0 +1,32 @@
+	.text
+	fsin
+	movq		%mm0, %mm1
+	fxsave		(%eax)
+	xsave		(%eax)
+	xsaveopt	(%eax)
+	xsavec		(%eax)
+	cmove		%eax,%ebx
+	movaps		%xmm0, %xmm1
+	movapd		%xmm0, %xmm1
+	mwait
+	psignb		%xmm0, %xmm1
+	blendvpd	%xmm0, %xmm1
+	pcmpgtq		%xmm0, %xmm1
+	vmovaps		%xmm0, %xmm1
+	vpabsb		%ymm0, %ymm1
+	vfmadd231ps	%ymm0, %ymm1, %ymm1
+	vmovaps		%zmm0, %zmm1
+	vplzcntd	%zmm0, %zmm1
+	vrsqrt28pd	%zmm0, %zmm1
+	vscatterpf0dpd	(%eax,%ymm1){%k1}
+	{evex} vpmovzxdq %xmm0, %xmm1
+	vandnpd		%zmm0, %zmm0, %zmm1
+	vpmaxuw		%zmm0, %zmm0, %zmm1
+	v4fnmaddss	(%ecx), %xmm4, %xmm1
+	vpopcntb	%zmm0, %zmm1
+	vp4dpwssd	(%ecx), %zmm0, %zmm1
+	vpmadd52luq	(%ecx), %zmm0, %zmm1
+	vpermt2b	(%ecx), %zmm0, %zmm1
+	vpcompressb	%zmm0, %zmm1
+	vpdpwssds	(%ecx), %zmm0, %zmm1
+	vcvtne2ps2bf16	(%ecx), %zmm0, %zmm1
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/pr23900-1-32.rd	2020-08-20 15:46:11.850699543 +0100
@@ -0,0 +1,14 @@
+#source: pr23900-1.s
+#ld:
+#readelf: -l --wide
+#target: *-*-linux* *-*-gnu* *-*-nacl*
+
+#...
+  GNU_PROPERTY .* +0x4
+#...
+ +[0-9]+ +.*\ \.note\.gnu\.property .*
+#...
+ +[0-9]+ +\.note\.gnu\.property 
+#...
+ +[0-9]+ +\.note\.gnu\.property 
+#...
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/pr23900-1-64.rd	2020-08-20 15:46:16.968685596 +0100
@@ -0,0 +1,14 @@
+#source: pr23900-1.s
+#ld:
+#readelf: -l --wide
+#target: *-*-linux* *-*-gnu* *-*-nacl*
+
+#...
+  GNU_PROPERTY .* +0x8
+#...
+ +[0-9]+ +.*\ \.note\.gnu\.property .*
+#...
+ +[0-9]+ +\.note\.gnu\.property 
+#...
+ +[0-9]+ +\.note\.gnu\.property 
+#...
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/pr23900-1.d	2020-08-20 15:46:26.546659490 +0100
@@ -0,0 +1,16 @@
+#ld:
+#readelf: --notes --wide -l
+#target: *-*-linux* *-*-gnu* *-*-nacl*
+
+#...
+  GNU_PROPERTY .*
+#...
+ +[0-9]+ +.*\.note\.gnu\.property.*
+#...
+ +[0-9]+ +\.note\.gnu\.property 
+#...
+ +[0-9]+ +\.note\.gnu\.property 
+#...
+Displaying notes found in: \.note\.gnu\.property
+[ 	]+Owner[ 	]+Data size[ 	]+Description
+[ 	]+GNU[ 	]+0x0+..[ 	]+NT_GNU_PROPERTY_TYPE_0[ 	]+Properties: no copy on protected 
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/pr23900-1.s	2020-08-20 15:46:30.072649878 +0100
@@ -0,0 +1,30 @@
+	.text
+	.global start	/* Used by SH targets.  */
+start:
+	.global _start
+_start:
+	.global __start
+__start:
+	.global main	/* Used by HPPA targets.  */
+main:
+	.globl	_main	/* Used by LynxOS targets.  */
+_main:
+	.dc.a 0
+
+	.section .note.gnu.property, "a"
+	.p2align ALIGN
+	.dc.l .L1 - .L0		/* name length.  */
+	.dc.l .L3 - .L1		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.dc.l 5			/* note type.  */
+.L0:
+	.asciz "GNU"		/* vendor name.  */
+.L1:
+	.p2align ALIGN
+	/* GNU_PROPERTY_NO_COPY_ON_PROTECTED */
+	.dc.l 2			/* pr_type.  */
+	.dc.l .L5 - .L4		/* pr_datasz.  */
+.L4:
+.L5:
+	.p2align ALIGN
+.L3:
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/pr23900-2.s	2020-08-20 15:46:36.328632828 +0100
@@ -0,0 +1,32 @@
+	.text
+	.global start	/* Used by SH targets.  */
+start:
+	.global _start
+_start:
+	.global __start
+__start:
+	.global main	/* Used by HPPA targets.  */
+main:
+	.globl	_main	/* Used by LynxOS targets.  */
+_main:
+	.dc.a 0
+
+	/* NB: Deliberately incorrect section name.  Should be
+	       .note.gnu.property.  */
+	.section .note, "a"
+	.p2align ALIGN
+	.dc.l .L1 - .L0		/* name length.  */
+	.dc.l .L3 - .L1		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.dc.l 5			/* note type.  */
+.L0:
+	.asciz "GNU"		/* vendor name.  */
+.L1:
+	.p2align ALIGN
+	/* GNU_PROPERTY_NO_COPY_ON_PROTECTED */
+	.dc.l 2			/* pr_type.  */
+	.dc.l .L5 - .L4		/* pr_datasz.  */
+.L4:
+.L5:
+	.p2align ALIGN
+.L3:
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/pr23900-2a.d	2020-08-20 15:46:42.642615623 +0100
@@ -0,0 +1,9 @@
+#source: pr23900-2.s
+#ld:
+#readelf: --notes --wide
+#target: *-*-linux* *-*-gnu* *-*-nacl*
+
+#...
+Displaying notes found in: \.note
+[ 	]+Owner[ 	]+Data size[ 	]+Description
+[ 	]+GNU[ 	]+0x0+..[ 	]+NT_GNU_PROPERTY_TYPE_0[ 	]+Properties: no copy on protected 
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/pr23900-2b.d	2020-08-20 15:46:48.738599006 +0100
@@ -0,0 +1,9 @@
+#source: pr23900-2.s
+#ld:
+#readelf: -l --wide
+#target: *-*-linux* *-*-gnu* *-*-nacl*
+
+#failif
+#...
+  GNU_PROPERTY .*
+#...
--- /dev/null	2020-08-20 07:54:24.260993139 +0100
+++ binutils-2.30/ld/testsuite/ld-elf/stack-noexec.rd	2020-08-20 15:46:59.907568567 +0100
@@ -0,0 +1,3 @@
+#...
+  GNU_STACK      0x0+00000 0x0+000000 0x0+000000 0x0+000 0x.+0000 RW  0x[0-9a-f]+
+#pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-3.r binutils-2.30/ld/testsuite/ld-x86-64/property-3.r
--- binutils.orig/ld/testsuite/ld-x86-64/property-3.r	2020-08-21 10:21:01.138676431 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-3.r	2020-08-21 10:47:30.373599165 +0100
@@ -3,5 +3,5 @@ Displaying notes found in: .note.gnu.pro
   Owner                 Data size	Description
   GNU                  0x[0-9a-f]+	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x800000
-	x86 ISA needed: i486, 586
+	x86 ISA needed: i486, 58.*
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-4.r binutils-2.30/ld/testsuite/ld-x86-64/property-4.r
--- binutils.orig/ld/testsuite/ld-x86-64/property-4.r	2020-08-21 10:21:01.122676481 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-4.r	2020-08-21 10:49:39.940182100 +0100
@@ -3,5 +3,5 @@ Displaying notes found in: .note.gnu.pro
   Owner                 Data size	Description
   GNU                  0x[0-9a-f]+	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x800000
-	x86 ISA needed: i486, 586, SSE
+	x86 ISA needed: i486, 586, SS.*
 #pass
diff -rup binutils.orig/ld/testsuite/ld-x86-64/property-5.r binutils-2.30/ld/testsuite/ld-x86-64/property-5.r
--- binutils.orig/ld/testsuite/ld-x86-64/property-5.r	2020-08-21 10:21:01.127676465 +0100
+++ binutils-2.30/ld/testsuite/ld-x86-64/property-5.r	2020-08-21 10:50:06.198097582 +0100
@@ -3,5 +3,5 @@ Displaying notes found in: .note.gnu.pro
   Owner                 Data size	Description
   GNU                  0x[0-9a-f]+	NT_GNU_PROPERTY_TYPE_0
       Properties: stack size: 0x900000
-	x86 ISA needed: i486, 586, SSE
+	x86 ISA needed: i486, 586, SS.*
 #pass