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 <r...@twiddle.net> >> 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 (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\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 0xc0000000 +#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 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; }