RISC-V: Add GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS and GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED

This patch adds two new GNU properties for RISC-V:
GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS and GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED.

We only add readelf and define the properties in this patch.

Ref: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/417
This commit is contained in:
Kito Cheng
2025-06-11 16:33:47 +08:00
committed by Nelson Chu
parent 51a39a59ca
commit 4ad5217caf
5 changed files with 101 additions and 0 deletions

View File

@@ -21287,6 +21287,33 @@ decode_aarch64_feature_1_and (unsigned int bitmask)
} }
} }
static void
decode_riscv_feature_1_and (unsigned int bitmask)
{
while (bitmask)
{
unsigned int bit = bitmask & (- bitmask);
bitmask &= ~ bit;
switch (bit)
{
case GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED:
printf ("CFI_LP_UNLABELED");
break;
case GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS:
printf ("CFI_SS");
break;
default:
printf (_("<unknown: %x>"), bit);
break;
}
if (bitmask)
printf (", ");
}
}
static void static void
decode_1_needed (unsigned int bitmask) decode_1_needed (unsigned int bitmask)
{ {
@@ -21477,6 +21504,18 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
goto next; goto next;
} }
} }
else if (filedata->file_header.e_machine == EM_RISCV)
{
if (type == GNU_PROPERTY_RISCV_FEATURE_1_AND)
{
printf ("RISC-V AND feature: ");
if (datasz != 4)
printf (_("<corrupt length: %#x> "), datasz);
else
decode_riscv_feature_1_and (byte_get (ptr, 4));
goto next;
}
}
} }
else else
{ {

View File

@@ -0,0 +1,8 @@
#as: -defsym __property_zicfilp_unlabeled__=1 -march=rv64i -mabi=lp64
#readelf: -n
#source: property.s
Displaying notes found in: .note.gnu.property
[ ]+Owner[ ]+Data size[ ]+Description
[ ]+GNU[ ]+0x00000010[ ]+NT_GNU_PROPERTY_TYPE_0
[ ]+Properties: RISC-V AND feature: CFI_LP_UNLABELED

View File

@@ -0,0 +1,8 @@
#as: -defsym __property_zicfiss__=1 -march=rv64i -mabi=lp64
#readelf: -n
#source: property.s
Displaying notes found in: .note.gnu.property
[ ]+Owner[ ]+Data size[ ]+Description
[ ]+GNU[ ]+0x00000010[ ]+NT_GNU_PROPERTY_TYPE_0
[ ]+Properties: RISC-V AND feature: CFI_SS

View File

@@ -0,0 +1,41 @@
.text
.globl _start
.type _start,@function
_start:
ret
.ifdef __property_zicfilp_unlabeled__
.section ".note.gnu.property", "a"
.p2align 3
.long 1f - 0f /* name length */
.long 5f - 2f /* data length */
.long 5 /* note type */
0: .asciz "GNU" /* vendor name */
1:
.p2align 3
2: .long 0xc0000000 /* pr_type. */
.long 4f - 3f /* pr_datasz. */
3:
.long 0x1 /* GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED. */
4:
.p2align 3
5:
.endif
.ifdef __property_zicfiss__
.section ".note.gnu.property", "a"
.p2align 3
.long 1f - 0f /* name length */
.long 5f - 2f /* data length */
.long 5 /* note type */
0: .asciz "GNU" /* vendor name */
1:
.p2align 3
2: .long 0xc0000000 /* pr_type. */
.long 4f - 3f /* pr_datasz. */
3:
.long 0x2 /* GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS. */
4:
.p2align 3
5:
.endif

View File

@@ -1041,6 +1041,11 @@
#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1) #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1)
#define GNU_PROPERTY_AARCH64_FEATURE_1_GCS (1U << 2) #define GNU_PROPERTY_AARCH64_FEATURE_1_GCS (1U << 2)
/* RISC-V specific GNU PROPERTY. */
#define GNU_PROPERTY_RISCV_FEATURE_1_AND 0xc0000000
#define GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED (1U << 0)
#define GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS (1U << 1)
/* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG). */ /* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG). */
#define GNU_ABI_TAG_LINUX 0 #define GNU_ABI_TAG_LINUX 0
#define GNU_ABI_TAG_HURD 1 #define GNU_ABI_TAG_HURD 1