[binutils-gdb] RISC-V: Add GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS and GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED
Nelson Chu
nelsonc1225@sourceware.org
Tue Jun 24 10:16:18 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4ad5217caf706925014e38be2bc561a2fa094ece
commit 4ad5217caf706925014e38be2bc561a2fa094ece
Author: Kito Cheng <kito.cheng@sifive.com>
Date: Wed Jun 11 16:33:47 2025 +0800
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
Diff:
---
binutils/readelf.c | 39 ++++++++++++++++++++
.../binutils-all/riscv/property-cfi-lp-unlabeled.d | 8 +++++
.../testsuite/binutils-all/riscv/property-cfi-ss.d | 8 +++++
binutils/testsuite/binutils-all/riscv/property.s | 41 ++++++++++++++++++++++
include/elf/common.h | 5 +++
5 files changed, 101 insertions(+)
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 (_("<unknown: %x>"), 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 (_("<corrupt length: %#x> "), 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
More information about the Binutils-cvs
mailing list