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


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

Re: [PATCH] Always use align_size as pr_datasz for GNU_PROPERTY_STACK_SIZE


On Thu, Aug 9, 2018 at 4:37 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> 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.

I am checking in this patch.


-- 
H.J.
From 9c973a29df61c411e24ce51b13401333c6f6e0e7 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 9 Aug 2018 04:29:43 -0700
Subject: [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.

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/ChangeLog                                 |   7 +
 bfd/elf-properties.c                          |  22 +++-
 binutils/ChangeLog                            |   7 +
 .../testsuite/binutils-all/x86-64/pr23494c.s  | 123 ++++++++++++++++++
 .../binutils-all/x86-64/pr23494e-x32.d        |  13 ++
 .../testsuite/binutils-all/x86-64/pr23494e.d  |  13 ++
 6 files changed, 178 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/ChangeLog b/bfd/ChangeLog
index d4bed23e58..20aa4f3c87 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2018-08-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+	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.
+
 2018-08-08  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR binutils/23494
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/ChangeLog b/binutils/ChangeLog
index b618044094..071a005134 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,10 @@
+2018-08-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+	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.
+
 2018-08-10  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* testsuite/binutils-all/x86-64/pr23494a-x32.d: Skip nacl
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..825f45d679
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494e-x32.d
@@ -0,0 +1,13 @@
+#PROG: objcopy
+#source: pr23494c.s
+#as: --x32
+#objcopy: -O elf64-x86-64 --decompress-debug-sections
+#readelf: -n
+#not-target: x86_64-*-nacl*
+
+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..ffb89886f7
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/pr23494e.d
@@ -0,0 +1,13 @@
+#PROG: objcopy
+#source: pr23494c.s
+#as: --64 -defsym __64_bit__=1
+#objcopy: -O elf32-x86-64 --decompress-debug-sections
+#readelf: -n
+#not-target: x86_64-*-nacl*
+
+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]