RISC-V: riscv_parse_subset_t's isa_spec is only parser input

Alan Modra amodra@gmail.com
Mon Jun 8 00:37:51 GMT 2026


check_compiler_available fails with a ld segfault linking
int main (void) { return 0; }

Program received signal SIGSEGV, Segmentation fault.
0x0000000000466a64 in riscv_parse_add_subset (rps=rps@entry=0x7fffffffd450, subset=subset@entry=0x962ca0 "zaamo", major=-1, minor=-1, implicit=implicit@entry=true) at /home/alan/src/binutils-gdb/bfd/elfxx-riscv.c:1947
1947	    riscv_get_default_ext_version (*rps->isa_spec, subset,
(gdb) p rps->isa_spec
$1 = (const enum riscv_spec_class *) 0x0

This was triggered when calling riscv_merge_attributes for crti.o
which had
(gdb) p ibfd->tdata.elf_obj_data->known_obj_attributes[OBJ_ATTR_PROC][Tag_RISCV_arch]
$5 = {type = 2, i = 0, s = 0x97e4c0 "rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0_zmmul1p0"}

Fix the segfault by reinstating a NULL check removed with commit
413cf36d8e81

diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index df6ff6448c1..67fbf0f72ca 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -1942,8 +1942,9 @@ riscv_parse_add_subset (riscv_parse_subset_t *rps,
   int major_version = major;
   int minor_version = minor;
 
-  if (major_version == RISCV_UNKNOWN_VERSION
+  if ((major_version == RISCV_UNKNOWN_VERSION
        || minor_version == RISCV_UNKNOWN_VERSION)
+      && rps->isa_spec != NULL)
     riscv_get_default_ext_version (*rps->isa_spec, subset,
 				   &major_version, &minor_version);
 

-- 
Alan Modra


More information about the Binutils mailing list