From 9c973a29df61c411e24ce51b13401333c6f6e0e7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" 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 d4bed23e582..20aa4f3c874 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2018-08-10 H.J. Lu + + 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 PR binutils/23494 diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c index 0ac055534d9..f58bdc0711e 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 b618044094a..071a005134b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2018-08-10 H.J. Lu + + 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 * 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 00000000000..a478e7a885b --- /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 00000000000..825f45d679b --- /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 00000000000..ffb89886f78 --- /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.30.2