From 4ad5217caf706925014e38be2bc561a2fa094ece Mon Sep 17 00:00:00 2001 From: Kito Cheng Date: Wed, 11 Jun 2025 16:33:47 +0800 Subject: [PATCH] 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 --- binutils/readelf.c | 39 ++++++++++++++++++ .../riscv/property-cfi-lp-unlabeled.d | 8 ++++ .../binutils-all/riscv/property-cfi-ss.d | 8 ++++ .../testsuite/binutils-all/riscv/property.s | 41 +++++++++++++++++++ include/elf/common.h | 5 +++ 5 files changed, 101 insertions(+) create mode 100644 binutils/testsuite/binutils-all/riscv/property-cfi-lp-unlabeled.d create mode 100644 binutils/testsuite/binutils-all/riscv/property-cfi-ss.d create mode 100644 binutils/testsuite/binutils-all/riscv/property.s diff --git a/binutils/readelf.c b/binutils/readelf.c index dd1871d8c75..77a88bff032 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -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 (_(""), bit); + break; + } + if (bitmask) + printf (", "); + } +} + static void decode_1_needed (unsigned int bitmask) { @@ -21477,6 +21504,18 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote) 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 (_(" "), datasz); + else + decode_riscv_feature_1_and (byte_get (ptr, 4)); + goto next; + } + } } else { diff --git a/binutils/testsuite/binutils-all/riscv/property-cfi-lp-unlabeled.d b/binutils/testsuite/binutils-all/riscv/property-cfi-lp-unlabeled.d new file mode 100644 index 00000000000..396b4cda7c2 --- /dev/null +++ b/binutils/testsuite/binutils-all/riscv/property-cfi-lp-unlabeled.d @@ -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 diff --git a/binutils/testsuite/binutils-all/riscv/property-cfi-ss.d b/binutils/testsuite/binutils-all/riscv/property-cfi-ss.d new file mode 100644 index 00000000000..5bc844aed73 --- /dev/null +++ b/binutils/testsuite/binutils-all/riscv/property-cfi-ss.d @@ -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 diff --git a/binutils/testsuite/binutils-all/riscv/property.s b/binutils/testsuite/binutils-all/riscv/property.s new file mode 100644 index 00000000000..1b6265499f5 --- /dev/null +++ b/binutils/testsuite/binutils-all/riscv/property.s @@ -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 diff --git a/include/elf/common.h b/include/elf/common.h index fd032d1e03e..01812b48caa 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -1041,6 +1041,11 @@ #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1) #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). */ #define GNU_ABI_TAG_LINUX 0 #define GNU_ABI_TAG_HURD 1 -- 2.39.5