[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