RE: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
Hi James -Original Message- From: James Greenhalgh Sent: 18 April 2019 09:56 To: Sudakshina Das Cc: Richard Henderson ; H.J. Lu ; Richard Henderson ; gcc-patches@gcc.gnu.org; nd ; Richard Earnshaw ; Marcus Shawcroft ; ni...@redhat.com Subject: Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC. On Thu, Apr 04, 2019 at 05:01:06PM +0100, Sudakshina Das wrote: > Hi Richard > > On 03/04/2019 11:28, Richard Henderson wrote: > > On 4/3/19 5:19 PM, Sudakshina Das wrote: > >> + /* PT_NOTE header: namesz, descsz, type. > >> + namesz = 4 ("GNU\0") > >> + descsz = 16 (Size of the program property array) > >> + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ > >> + assemble_align (POINTER_SIZE); > >> + assemble_integer (GEN_INT (4), 4, 32, 1); > >> + assemble_integer (GEN_INT (16), 4, 32, 1); > > > > So, it's 16 only if POINTER_SIZE == 64. > > > > I think ROUND_UP (12, POINTER_BYTES) is what you want here. > > > > > Ah yes. I have made that change now. This is OK, but instead of: > diff --git a/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > b/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > index > e8e3cdac51350b545e5c2a644a3e1f4d1c37f88d..1fe92ff08935d4c6f08affcbd77e > a91537030640 100644 > --- a/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > @@ -4,7 +4,9 @@ > int > f (int a, ...) > { > - /* { dg-final { scan-assembler-not "str" } } */ > + /* Fails on aarch64*-*-linux* if configured with > +--enable-standard-branch-protection because of the GNU NOTE > + section. */ > + /* { dg-final { scan-assembler-not "str" { target { ! > + aarch64*-*-linux* } || { ! default_branch_protection } } } } */ >return a; > } > Can you just change the regex to check for str followed by a tab, or > something that looks else which looks like the instruction and doesn't match > against 'string'. >Thanks, >James Ah yes, I have reduced the diff in this test to only update the scan directive to look for 'str\t' instead. Committed as r270515. Thanks Sudi > > Thanks > Sudi > > > > > r~ > > >
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
On Thu, Apr 04, 2019 at 05:01:06PM +0100, Sudakshina Das wrote: > Hi Richard > > On 03/04/2019 11:28, Richard Henderson wrote: > > On 4/3/19 5:19 PM, Sudakshina Das wrote: > >> + /* PT_NOTE header: namesz, descsz, type. > >> + namesz = 4 ("GNU\0") > >> + descsz = 16 (Size of the program property array) > >> + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ > >> + assemble_align (POINTER_SIZE); > >> + assemble_integer (GEN_INT (4), 4, 32, 1); > >> + assemble_integer (GEN_INT (16), 4, 32, 1); > > > > So, it's 16 only if POINTER_SIZE == 64. > > > > I think ROUND_UP (12, POINTER_BYTES) is what you want here. > > > > > Ah yes. I have made that change now. This is OK, but instead of: > diff --git a/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > b/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > index > e8e3cdac51350b545e5c2a644a3e1f4d1c37f88d..1fe92ff08935d4c6f08affcbd77ea91537030640 > 100644 > --- a/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/va_arg_1.c > @@ -4,7 +4,9 @@ > int > f (int a, ...) > { > - /* { dg-final { scan-assembler-not "str" } } */ > + /* Fails on aarch64*-*-linux* if configured with > +--enable-standard-branch-protection because of the GNU NOTE section. */ > + /* { dg-final { scan-assembler-not "str" { target { ! aarch64*-*-linux* } > || { ! default_branch_protection } } } } */ >return a; > } Can you just change the regex to check for str followed by a tab, or something that looks else which looks like the instruction and doesn't match against 'string'. Thanks, James > > Thanks > Sudi > > > > > r~ > > >
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
Ping. On 04/04/2019 17:01, Sudakshina Das wrote: > Hi Richard > > On 03/04/2019 11:28, Richard Henderson wrote: >> On 4/3/19 5:19 PM, Sudakshina Das wrote: >>> + /* PT_NOTE header: namesz, descsz, type. >>> + namesz = 4 ("GNU\0") >>> + descsz = 16 (Size of the program property array) >>> + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ >>> + assemble_align (POINTER_SIZE); >>> + assemble_integer (GEN_INT (4), 4, 32, 1); >>> + assemble_integer (GEN_INT (16), 4, 32, 1); >> >> So, it's 16 only if POINTER_SIZE == 64. >> >> I think ROUND_UP (12, POINTER_BYTES) is what you want here. >> > > > Ah yes. I have made that change now. > > Thanks > Sudi > >> >> r~ >> >
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
Hi Richard On 03/04/2019 11:28, Richard Henderson wrote: > On 4/3/19 5:19 PM, Sudakshina Das wrote: >> + /* PT_NOTE header: namesz, descsz, type. >> + namesz = 4 ("GNU\0") >> + descsz = 16 (Size of the program property array) >> + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ >> + assemble_align (POINTER_SIZE); >> + assemble_integer (GEN_INT (4), 4, 32, 1); >> + assemble_integer (GEN_INT (16), 4, 32, 1); > > So, it's 16 only if POINTER_SIZE == 64. > > I think ROUND_UP (12, POINTER_BYTES) is what you want here. > Ah yes. I have made that change now. Thanks Sudi > > r~ > diff --git a/gcc/config/aarch64/aarch64-linux.h b/gcc/config/aarch64/aarch64-linux.h index 9d0292d64f20939ccedd7ab56027aa1282826b23..5e8b34ded03c78493f868e38647bf57c2da5187c 100644 --- a/gcc/config/aarch64/aarch64-linux.h +++ b/gcc/config/aarch64/aarch64-linux.h @@ -83,7 +83,7 @@ #define GNU_USER_TARGET_D_CRITSEC_SIZE 48 -#define TARGET_ASM_FILE_END file_end_indicate_exec_stack +#define TARGET_ASM_FILE_END aarch64_file_end_indicate_exec_stack /* Uninitialized common symbols in non-PIE executables, even with strong definitions in dependent shared libraries, will resolve diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index b38505b0872688634b2d3f625ab8d313e89cfca0..83b8ef84808c19fa1214fa06c32957936f5eb520 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -18744,6 +18744,57 @@ aarch64_stack_protect_guard (void) return NULL_TREE; } +/* Implement TARGET_ASM_FILE_END for AArch64. This adds the AArch64 GNU NOTE + section at the end if needed. */ +#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc000 +#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI (1U << 0) +#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1) +void +aarch64_file_end_indicate_exec_stack () +{ + file_end_indicate_exec_stack (); + + unsigned feature_1_and = 0; + if (aarch64_bti_enabled ()) +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI; + + if (aarch64_ra_sign_scope != AARCH64_FUNCTION_NONE) +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC; + + if (feature_1_and) +{ + /* Generate .note.gnu.property section. */ + switch_to_section (get_section (".note.gnu.property", + SECTION_NOTYPE, NULL)); + + /* PT_NOTE header: namesz, descsz, type. + namesz = 4 ("GNU\0") + descsz = 16 (Size of the program property array) + [(12 + padding) * Number of array elements] + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ + assemble_align (POINTER_SIZE); + assemble_integer (GEN_INT (4), 4, 32, 1); + assemble_integer (GEN_INT (ROUND_UP (12, POINTER_BYTES)), 4, 32, 1); + assemble_integer (GEN_INT (5), 4, 32, 1); + + /* PT_NOTE name. */ + assemble_string ("GNU", 4); + + /* PT_NOTE contents for NT_GNU_PROPERTY_TYPE_0: + type = GNU_PROPERTY_AARCH64_FEATURE_1_AND + datasz = 4 + data = feature_1_and. */ + assemble_integer (GEN_INT (GNU_PROPERTY_AARCH64_FEATURE_1_AND), 4, 32, 1); + assemble_integer (GEN_INT (4), 4, 32, 1); + assemble_integer (GEN_INT (feature_1_and), 4, 32, 1); + + /* Pad the size of the note to the required alignment. */ + assemble_align (POINTER_SIZE); +} +} +#undef GNU_PROPERTY_AARCH64_FEATURE_1_PAC +#undef GNU_PROPERTY_AARCH64_FEATURE_1_BTI +#undef GNU_PROPERTY_AARCH64_FEATURE_1_AND /* Target-specific selftests. */ diff --git a/gcc/testsuite/gcc.target/aarch64/bti-1.c b/gcc/testsuite/gcc.target/aarch64/bti-1.c index a8c60412e310a4f322372f334ae5314f426d310e..5a556b08ed15679b25676a11fe9c7a64641ee671 100644 --- a/gcc/testsuite/gcc.target/aarch64/bti-1.c +++ b/gcc/testsuite/gcc.target/aarch64/bti-1.c @@ -61,3 +61,4 @@ lab2: } /* { dg-final { scan-assembler-times "hint\t34" 1 } } */ /* { dg-final { scan-assembler-times "hint\t36" 12 } } */ +/* { dg-final { scan-assembler ".note.gnu.property" { target *-*-linux* } } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/va_arg_1.c b/gcc/testsuite/gcc.target/aarch64/va_arg_1.c index e8e3cdac51350b545e5c2a644a3e1f4d1c37f88d..1fe92ff08935d4c6f08affcbd77ea91537030640 100644 --- a/gcc/testsuite/gcc.target/aarch64/va_arg_1.c +++ b/gcc/testsuite/gcc.target/aarch64/va_arg_1.c @@ -4,7 +4,9 @@ int f (int a, ...) { - /* { dg-final { scan-assembler-not "str" } } */ + /* Fails on aarch64*-*-linux* if configured with +--enable-standard-branch-protection because of the GNU NOTE section. */ + /* { dg-final { scan-assembler-not "str" { target { ! aarch64*-*-linux* } || { ! default_branch_protection } } } } */ return a; }
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
On 4/3/19 5:19 PM, Sudakshina Das wrote: > + /* PT_NOTE header: namesz, descsz, type. > + namesz = 4 ("GNU\0") > + descsz = 16 (Size of the program property array) > + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ > + assemble_align (POINTER_SIZE); > + assemble_integer (GEN_INT (4), 4, 32, 1); > + assemble_integer (GEN_INT (16), 4, 32, 1); So, it's 16 only if POINTER_SIZE == 64. I think ROUND_UP (12, POINTER_BYTES) is what you want here. r~
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
Hi Richard On 02/04/2019 10:25, Sudakshina Das wrote: > Hi > > On 02/04/2019 03:27, H.J. Lu wrote: >> On Tue, Apr 2, 2019 at 10:05 AM Richard Henderson >> wrote: >>> >>> On 4/1/19 8:53 PM, Sudakshina Das wrote: > This could stand to use a comment, a moment's thinking about the > sizes, and to > use the existing asm output functions. > > /* PT_NOTE header: namesz, descsz, type. > namesz = 4 ("GNU\0") > descsz = 12 (see below) I was trying out these changes but the descsz of 12 gets rejected by readelf. It hits the following unsigned int size = is_32bit_elf ? 4 : 8; printf (_(" Properties: ")); if (pnote->descsz < 8 || (pnote->descsz % size) != 0) { printf (_("\n"), pnote->descsz); return; } >>> >>> Hmm, interesting. The docs say that padding is not to be included in >>> descsz >>> (gabi4.1, page 82). To my eye this is a bug in binutils, but perhaps >>> we will >>> have to live with it. >>> >>> Nick, thoughts? >> >> descsz is wrong. From: >> >> https://github.com/hjl-tools/linux-abi/wiki/Linux-Extensions-to-gABI >> >> n_desc The note descriptor. The first n_descsz bytes in n_desc is the >> pro- >> gram property array. >> >> The program property array >> Each array element represents one program property with type, data >> size and data. >> In 64-bit objects, each element is an array of 8-byte integers in the >> format of the >> target processor. In 32-bit objects, each element is an array of >> 4-byte integers in >> the format of the target processor. > > Thanks @HJ for clarifying that. I should have been more careful in > spotting the difference. > > @Richard I will update my patch according to your suggestions but > keeping in mind decssz should be the size of the entire program property > array so 16 in this case. > I have updated the patch as per your suggestions. The Changelog is still valid from my original patch. Thanks Sudi > Thanks > Sudi >> >> > diff --git a/gcc/config/aarch64/aarch64-linux.h b/gcc/config/aarch64/aarch64-linux.h index 9d0292d64f20939ccedd7ab56027aa1282826b23..5e8b34ded03c78493f868e38647bf57c2da5187c 100644 --- a/gcc/config/aarch64/aarch64-linux.h +++ b/gcc/config/aarch64/aarch64-linux.h @@ -83,7 +83,7 @@ #define GNU_USER_TARGET_D_CRITSEC_SIZE 48 -#define TARGET_ASM_FILE_END file_end_indicate_exec_stack +#define TARGET_ASM_FILE_END aarch64_file_end_indicate_exec_stack /* Uninitialized common symbols in non-PIE executables, even with strong definitions in dependent shared libraries, will resolve diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index b38505b0872688634b2d3f625ab8d313e89cfca0..f25f7da8f0224167db68e61a2ba88f0943316360 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -18744,6 +18744,56 @@ aarch64_stack_protect_guard (void) return NULL_TREE; } +/* Implement TARGET_ASM_FILE_END for AArch64. This adds the AArch64 GNU NOTE + section at the end if needed. */ +#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc000 +#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI (1U << 0) +#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1) +void +aarch64_file_end_indicate_exec_stack () +{ + file_end_indicate_exec_stack (); + + unsigned feature_1_and = 0; + if (aarch64_bti_enabled ()) +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI; + + if (aarch64_ra_sign_scope != AARCH64_FUNCTION_NONE) +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC; + + if (feature_1_and) +{ + /* Generate .note.gnu.property section. */ + switch_to_section (get_section (".note.gnu.property", + SECTION_NOTYPE, NULL)); + + /* PT_NOTE header: namesz, descsz, type. + namesz = 4 ("GNU\0") + descsz = 16 (Size of the program property array) + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ + assemble_align (POINTER_SIZE); + assemble_integer (GEN_INT (4), 4, 32, 1); + assemble_integer (GEN_INT (16), 4, 32, 1); + assemble_integer (GEN_INT (5), 4, 32, 1); + + /* PT_NOTE name. */ + assemble_string ("GNU", 4); + + /* PT_NOTE contents for NT_GNU_PROPERTY_TYPE_0: + type = GNU_PROPERTY_AARCH64_FEATURE_1_AND + datasz = 4 + data = feature_1_and. */ + assemble_integer (GEN_INT (GNU_PROPERTY_AARCH64_FEATURE_1_AND), 4, 32, 1); + assemble_integer (GEN_INT (4), 4, 32, 1); + assemble_integer (GEN_INT (feature_1_and), 4, 32, 1); + + /* Pad the size of the note to the required alignment. */ + assemble_align (POINTER_SIZE); +} +} +#undef GNU_PROPERTY_AARCH64_FEATURE_1_PAC +#undef GNU_PROPERTY_AARCH64_FEATURE_1_BTI +#undef GNU_PROPERTY_AARCH64_FEATURE_1_AND /* Target-specific selftests. */ diff --git a/gcc/testsuite/gcc.target/aarch64/bti-1.c b/gcc/testsuite/gcc.target/aarch64/bti-1.c index
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
Hi On 02/04/2019 03:27, H.J. Lu wrote: > On Tue, Apr 2, 2019 at 10:05 AM Richard Henderson wrote: >> >> On 4/1/19 8:53 PM, Sudakshina Das wrote: This could stand to use a comment, a moment's thinking about the sizes, and to use the existing asm output functions. /* PT_NOTE header: namesz, descsz, type. namesz = 4 ("GNU\0") descsz = 12 (see below) >>> I was trying out these changes but the descsz of 12 gets rejected by >>> readelf. It hits the following >>> >>> unsigned intsize = is_32bit_elf ? 4 : 8; >>> >>> printf (_(" Properties: ")); >>> >>> if (pnote->descsz < 8 || (pnote->descsz % size) != 0) >>> { >>> printf (_("\n"), >>> pnote->descsz); >>> return; >>> } >> >> Hmm, interesting. The docs say that padding is not to be included in descsz >> (gabi4.1, page 82). To my eye this is a bug in binutils, but perhaps we will >> have to live with it. >> >> Nick, thoughts? > > descsz is wrong. From: > > https://github.com/hjl-tools/linux-abi/wiki/Linux-Extensions-to-gABI > > n_desc The note descriptor. The first n_descsz bytes in n_desc is the pro- > gram property array. > > The program property array > Each array element represents one program property with type, data > size and data. > In 64-bit objects, each element is an array of 8-byte integers in the > format of the > target processor. In 32-bit objects, each element is an array of > 4-byte integers in > the format of the target processor. Thanks @HJ for clarifying that. I should have been more careful in spotting the difference. @Richard I will update my patch according to your suggestions but keeping in mind decssz should be the size of the entire program property array so 16 in this case. Thanks Sudi > >
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
On Tue, Apr 2, 2019 at 10:05 AM Richard Henderson wrote: > > On 4/1/19 8:53 PM, Sudakshina Das wrote: > >> This could stand to use a comment, a moment's thinking about the sizes, > >> and to > >> use the existing asm output functions. > >> > >> /* PT_NOTE header: namesz, descsz, type. > >> namesz = 4 ("GNU\0") > >> descsz = 12 (see below) > > I was trying out these changes but the descsz of 12 gets rejected by > > readelf. It hits the following > > > >unsigned intsize = is_32bit_elf ? 4 : 8; > > > >printf (_(" Properties: ")); > > > >if (pnote->descsz < 8 || (pnote->descsz % size) != 0) > > { > >printf (_("\n"), > > pnote->descsz); > >return; > > } > > Hmm, interesting. The docs say that padding is not to be included in descsz > (gabi4.1, page 82). To my eye this is a bug in binutils, but perhaps we will > have to live with it. > > Nick, thoughts? descsz is wrong. From: https://github.com/hjl-tools/linux-abi/wiki/Linux-Extensions-to-gABI n_desc The note descriptor. The first n_descsz bytes in n_desc is the pro- gram property array. The program property array Each array element represents one program property with type, data size and data. In 64-bit objects, each element is an array of 8-byte integers in the format of the target processor. In 32-bit objects, each element is an array of 4-byte integers in the format of the target processor. -- H.J.
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
On 4/1/19 8:53 PM, Sudakshina Das wrote: >> This could stand to use a comment, a moment's thinking about the sizes, and >> to >> use the existing asm output functions. >> >> /* PT_NOTE header: namesz, descsz, type. >> namesz = 4 ("GNU\0") >> descsz = 12 (see below) > I was trying out these changes but the descsz of 12 gets rejected by > readelf. It hits the following > >unsigned intsize = is_32bit_elf ? 4 : 8; > >printf (_(" Properties: ")); > >if (pnote->descsz < 8 || (pnote->descsz % size) != 0) > { >printf (_("\n"), > pnote->descsz); >return; > } Hmm, interesting. The docs say that padding is not to be included in descsz (gabi4.1, page 82). To my eye this is a bug in binutils, but perhaps we will have to live with it. Nick, thoughts? r~
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
Hi Richard Thanks for the comments and pointing out the much cleaner existing asm output functions! On 29/03/2019 17:51, Richard Henderson wrote: >> +#define ASM_LONG "\t.long\t" > > Do not replicate targetm.asm_out.aligned_op.si, or integer_asm_op, really. > >> +aarch64_file_end_indicate_exec_stack () >> +{ >> + file_end_indicate_exec_stack (); >> + >> + if (!aarch64_bti_enabled () >> + && aarch64_ra_sign_scope == AARCH64_FUNCTION_NONE) >> +{ >> + return; >> +} > > This is redundant with... > >> + >> + unsigned feature_1_and = 0; >> + if (aarch64_bti_enabled ()) >> +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI; >> + >> + if (aarch64_ra_sign_scope != AARCH64_FUNCTION_NONE) >> +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC; >> + >> + if (feature_1_and) > > ... this. I prefer the second, as it's obvious. > >> + ASM_OUTPUT_ALIGN (asm_out_file, p2align); >> + /* name length. */ >> + fprintf (asm_out_file, ASM_LONG " 1f - 0f\n"); >> + /* data length. */ >> + fprintf (asm_out_file, ASM_LONG " 4f - 1f\n"); >> + /* note type: NT_GNU_PROPERTY_TYPE_0. */ >> + fprintf (asm_out_file, ASM_LONG " 5\n"); >> + fprintf (asm_out_file, "0:\n"); >> + /* vendor name: "GNU". */ >> + fprintf (asm_out_file, STRING_ASM_OP " \"GNU\"\n"); >> + fprintf (asm_out_file, "1:\n"); >> + ASM_OUTPUT_ALIGN (asm_out_file, p2align); >> + /* pr_type: GNU_PROPERTY_AARCH64_FEATURE_1_AND. */ >> + fprintf (asm_out_file, ASM_LONG " 0x%x\n", >> + GNU_PROPERTY_AARCH64_FEATURE_1_AND); >> + /* pr_datasz. */\ >> + fprintf (asm_out_file, ASM_LONG " 3f - 2f\n"); >> + fprintf (asm_out_file, "2:\n"); >> + /* GNU_PROPERTY_AARCH64_FEATURE_1_XXX. */ >> + fprintf (asm_out_file, ASM_LONG " 0x%x\n", feature_1_and); >> + fprintf (asm_out_file, "3:\n"); >> + ASM_OUTPUT_ALIGN (asm_out_file, p2align); >> + fprintf (asm_out_file, "4:\n"); > > This could stand to use a comment, a moment's thinking about the sizes, and to > use the existing asm output functions. > > /* PT_NOTE header: namesz, descsz, type. > namesz = 4 ("GNU\0") > descsz = 12 (see below) I was trying out these changes but the descsz of 12 gets rejected by readelf. It hits the following unsigned intsize = is_32bit_elf ? 4 : 8; printf (_(" Properties: ")); if (pnote->descsz < 8 || (pnote->descsz % size) != 0) { printf (_("\n"), pnote->descsz); return; } Thanks Sudi > type = 5 (NT_GNU_PROPERTY_TYPE_0). */ > assemble_align (POINTER_SIZE); > assemble_integer (GEN_INT (4), 4, 32, 1); > assemble_integer (GEN_INT (12), 4, 32, 1); > assemble_integer (GEN_INT (5), 4, 32, 1); > > /* PT_NOTE name */ > assemble_string ("GNU", 4); > > /* PT_NOTE contents for NT_GNU_PROPERTY_TYPE_0: > type = 0xc000 (GNU_PROPERTY_AARCH64_FEATURE_1_AND), > datasz = 4 > data = feature_1_and > Note that the current section offset is 16, > and there has been no padding so far. */ > assemble_integer (GEN_INT (0xc000), 4, 32, 1); > assemble_integer (GEN_INT (4), 4, 32, 1); > assemble_integer (GEN_INT (feature_1_and), 4, 32, 1); > > /* Pad the size of the note to the required alignment. */ > assemble_align (POINTER_SIZE); > > > r~ >
Re: [PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
> +#define ASM_LONG "\t.long\t" Do not replicate targetm.asm_out.aligned_op.si, or integer_asm_op, really. > +aarch64_file_end_indicate_exec_stack () > +{ > + file_end_indicate_exec_stack (); > + > + if (!aarch64_bti_enabled () > + && aarch64_ra_sign_scope == AARCH64_FUNCTION_NONE) > +{ > + return; > +} This is redundant with... > + > + unsigned feature_1_and = 0; > + if (aarch64_bti_enabled ()) > +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI; > + > + if (aarch64_ra_sign_scope != AARCH64_FUNCTION_NONE) > +feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC; > + > + if (feature_1_and) ... this. I prefer the second, as it's obvious. > + ASM_OUTPUT_ALIGN (asm_out_file, p2align); > + /* name length. */ > + fprintf (asm_out_file, ASM_LONG " 1f - 0f\n"); > + /* data length. */ > + fprintf (asm_out_file, ASM_LONG " 4f - 1f\n"); > + /* note type: NT_GNU_PROPERTY_TYPE_0. */ > + fprintf (asm_out_file, ASM_LONG " 5\n"); > + fprintf (asm_out_file, "0:\n"); > + /* vendor name: "GNU". */ > + fprintf (asm_out_file, STRING_ASM_OP " \"GNU\"\n"); > + fprintf (asm_out_file, "1:\n"); > + ASM_OUTPUT_ALIGN (asm_out_file, p2align); > + /* pr_type: GNU_PROPERTY_AARCH64_FEATURE_1_AND. */ > + fprintf (asm_out_file, ASM_LONG " 0x%x\n", > +GNU_PROPERTY_AARCH64_FEATURE_1_AND); > + /* pr_datasz. */\ > + fprintf (asm_out_file, ASM_LONG " 3f - 2f\n"); > + fprintf (asm_out_file, "2:\n"); > + /* GNU_PROPERTY_AARCH64_FEATURE_1_XXX. */ > + fprintf (asm_out_file, ASM_LONG " 0x%x\n", feature_1_and); > + fprintf (asm_out_file, "3:\n"); > + ASM_OUTPUT_ALIGN (asm_out_file, p2align); > + fprintf (asm_out_file, "4:\n"); This could stand to use a comment, a moment's thinking about the sizes, and to use the existing asm output functions. /* PT_NOTE header: namesz, descsz, type. namesz = 4 ("GNU\0") descsz = 12 (see below) type = 5 (NT_GNU_PROPERTY_TYPE_0). */ assemble_align (POINTER_SIZE); assemble_integer (GEN_INT (4), 4, 32, 1); assemble_integer (GEN_INT (12), 4, 32, 1); assemble_integer (GEN_INT (5), 4, 32, 1); /* PT_NOTE name */ assemble_string ("GNU", 4); /* PT_NOTE contents for NT_GNU_PROPERTY_TYPE_0: type = 0xc000 (GNU_PROPERTY_AARCH64_FEATURE_1_AND), datasz = 4 data = feature_1_and Note that the current section offset is 16, and there has been no padding so far. */ assemble_integer (GEN_INT (0xc000), 4, 32, 1); assemble_integer (GEN_INT (4), 4, 32, 1); assemble_integer (GEN_INT (feature_1_and), 4, 32, 1); /* Pad the size of the note to the required alignment. */ assemble_align (POINTER_SIZE); r~