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


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

[PATCH] Always use align_size as pr_datasz for GNU_PROPERTY_STACK_SIZE


For GNU_PROPERTY_STACK_SIZE, pr_datasz is the same as align_size, which
is 8 bytes for 64-bit ELF binaries and 4 bytes for 32-bit ELF binaries,
Use align_size as pr_datasz for GNU_PROPERTY_STACK_SIZE to convert
.note.gnu.property section.

OK for master branch?

H.J.
---
bfd/

	PR binutils/23494
	* elf-properties.c (elf_get_gnu_property_section_size): Always
	use align_size as pr_datasz for GNU_PROPERTY_STACK_SIZE.
	(elf_write_gnu_properties): Likewise.

binutils/

	PR binutils/23494
	* testsuite/binutils-all/x86-64/pr23494c.s: New file.
	* testsuite/binutils-all/x86-64/pr23494e-x32.d: Likewise.
	* testsuite/binutils-all/x86-64/pr23494e.d: Likewise.
---
 bfd/elf-properties.c                          |  22 +++-
 .../testsuite/binutils-all/x86-64/pr23494c.s  | 123 ++++++++++++++++++
 .../binutils-all/x86-64/pr23494e-x32.d        |  12 ++
 .../testsuite/binutils-all/x86-64/pr23494e.d  |  12 ++
 4 files changed, 162 insertions(+), 7 deletions(-)
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494c.s
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494e-x32.d
 create mode 100644 binutils/testsuite/binutils-all/x86-64/pr23494e.d

diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c
index 0ac055534d..f58bdc0711 100644
--- a/bfd/elf-properties.c
+++ b/bfd/elf-properties.c
@@ -320,7 +320,12 @@ elf_get_gnu_property_section_size (elf_property_list *list,
   for (; list != NULL; list = list->next)
     {
       /* There are 4 byte type + 4 byte datasz for each property.  */
-      size += 4 + 4 + list->property.pr_datasz;
+      unsigned int datasz;
+      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);
     }
@@ -336,6 +341,7 @@ elf_write_gnu_properties (bfd *abfd, bfd_byte *contents,
 			  unsigned int align_size)
 {
   unsigned int descsz;
+  unsigned int datasz;
   Elf_External_Note *e_note;
 
   e_note = (Elf_External_Note *) contents;
@@ -350,17 +356,19 @@ elf_write_gnu_properties (bfd *abfd, bfd_byte *contents,
   for (; list != NULL; list = list->next)
     {
       /* There are 4 byte type + 4 byte datasz for each property.  */
-      bfd_h_put_32 (abfd, list->property.pr_type,
-		    contents + size);
-      bfd_h_put_32 (abfd, list->property.pr_datasz,
-		    contents + size + 4);
+      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 (list->property.pr_datasz)
+	  switch (datasz)
 	    {
 	    default:
 	      /* Never should happen.  */
@@ -385,7 +393,7 @@ elf_write_gnu_properties (bfd *abfd, bfd_byte *contents,
 	  /* Never should happen.  */
 	  abort ();
 	}
-      size += list->property.pr_datasz;
+      size += datasz;
 
       /* Align each property.  */
       size = (size + (align_size - 1)) & ~ (align_size - 1);
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494c.s b/binutils/testsuite/binutils-all/x86-64/pr23494c.s
new file mode 100644
index 0000000000..a478e7a885
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494c.s
@@ -0,0 +1,123 @@
+	.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_STACK_SIZE */
+	.long 1			/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.dc.a -1
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
+
+	.section ".note.gnu.property", "a"
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	.long 1f - 0f		/* name length.  */
+	.long 3f - 1f		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.long 5			/* note type.  */
+0:
+	.asciz "GNU"		/* vendor name.  */
+1:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	/* GNU_PROPERTY_X86_ISA_1_USED */
+	.long 0xc0000000	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0xa
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
+
+	.section ".note.gnu.property", "a"
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	.long 1f - 0f		/* name length.  */
+	.long 3f - 1f		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.long 5			/* note type.  */
+0:
+	.asciz "GNU"		/* vendor name.  */
+1:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	/* GNU_PROPERTY_X86_ISA_1_NEEDED */
+	.long 0xc0000001	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0xa0
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
+
+	.section ".note.gnu.property", "a"
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	.long 1f - 0f		/* name length.  */
+	.long 3f - 1f		/* data length.  */
+	/* NT_GNU_PROPERTY_TYPE_0 */
+	.long 5			/* note type.  */
+0:
+	.asciz "GNU"		/* vendor name.  */
+1:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+	/* GNU_PROPERTY_X86_ISA_1_USED */
+	.long 0xc0000000	/* pr_type.  */
+	.long 5f - 4f		/* pr_datasz.  */
+4:
+	.long 0xa0
+5:
+.ifdef __64_bit__
+	.p2align 3
+.else
+	.p2align 2
+.endif
+3:
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494e-x32.d b/binutils/testsuite/binutils-all/x86-64/pr23494e-x32.d
new file mode 100644
index 0000000000..6a539411dd
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494e-x32.d
@@ -0,0 +1,12 @@
+#PROG: objcopy
+#source: pr23494c.s
+#as: --x32
+#objcopy: -O elf64-x86-64 --decompress-debug-sections
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size	Description
+  GNU                  0x00000030	NT_GNU_PROPERTY_TYPE_0
+      Properties: stack size: 0xffffffff
+	x86 ISA used: 586, SSE, SSE3, SSE4_1
+	x86 ISA needed: SSE3, SSE4_1
diff --git a/binutils/testsuite/binutils-all/x86-64/pr23494e.d b/binutils/testsuite/binutils-all/x86-64/pr23494e.d
new file mode 100644
index 0000000000..62e13d9221
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494e.d
@@ -0,0 +1,12 @@
+#PROG: objcopy
+#source: pr23494c.s
+#as: --64 -defsym __64_bit__=1
+#objcopy: -O elf32-x86-64 --decompress-debug-sections
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size	Description
+  GNU                  0x00000024	NT_GNU_PROPERTY_TYPE_0
+      Properties: stack size: 0xffffffff
+	x86 ISA used: 586, SSE, SSE3, SSE4_1
+	x86 ISA needed: SSE3, SSE4_1
-- 
2.17.1


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