[PATCH, GCC, AARCH64] Add GNU note section with BTI and PAC.
Sudakshina Das
Sudi.Das@arm.com
Mon Apr 1 13:53:00 GMT 2019
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 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;
}
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 = 0xc0000000 (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 (0xc0000000), 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~
>
More information about the Gcc-patches
mailing list