[PATCH] RISC-V: Add support for vendor-specific relocations

Nelson Chu nelson@rivosinc.com
Wed Apr 9 19:25:45 GMT 2025


Hi Alexey,


On Wed, Apr 9, 2025 at 4:59 PM Alexey Lapshin <alexey.lapshin@espressif.com>
wrote:

> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
> index ec254915c76..b9b0001f3f9 100644
> --- a/bfd/elfxx-riscv.c
> +++ b/bfd/elfxx-riscv.c
> @@ -960,6 +960,168 @@ static reloc_howto_type howto_table_internal[] =
>          false),                        /* pcrel_offset */
>  };
>
> +/* This howto table is used solely to provide relocation name strings.  */
> +static reloc_howto_type howto_table_vendor[] = {
> +  HOWTO (R_RISCV_CUSTOM0, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM0", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM1, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM1", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM2, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM2", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM3, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM3", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM4, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM4", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM5, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM5", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM6, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM6", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM7, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM7", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM8, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM8", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM9, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM9", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM10, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM10", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM11, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM11", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM12, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM12", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM13, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM13", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM14, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM14", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM15, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM15", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM16, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM16", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM17, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM17", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM18, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM18", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM19, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM19", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM20, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM20", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM21, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM21", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM22, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM22", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM23, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM23", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM24, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM24", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM25, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM25", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM26, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM26", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM27, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM27", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM28, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM28", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM29, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM29", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM30, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM30", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM31, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM31", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM32, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM32", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM33, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM33", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM34, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM34", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM35, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM35", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM36, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM36", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM37, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM37", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM38, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM38", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM39, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM39", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM40, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM40", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM41, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM41", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM42, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM42", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM43, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM43", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM44, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM44", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM45, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM45", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM46, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM46", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM47, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM47", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM48, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM48", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM49, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM49", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM50, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM50", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM51, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM51", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM52, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM52", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM53, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM53", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM54, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM54", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM55, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM55", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM56, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM56", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM57, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM57", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM58, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM58", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM59, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM59", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM60, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM60", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM61, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM61", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM62, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM62", false, 0, 0, false),
> +  HOWTO (R_RISCV_CUSTOM63, 0, 0, 0, false, 0, complain_overflow_dont,
> +        bfd_elf_generic_reloc, "R_RISCV_CUSTOM63", false, 0, 0, false)
> +};
>

I think the above shouldn't be necessary.  We already have howto_table and
howto_table_internal for standard cases, and you will add a howto_table_esp
for esp vendor, so could we try to do everything right in the
riscv_elf_rtype_to_howto?  Which means let riscv_elf_rtype_to_howto choose
the right how_to tables, including vendors', which is the howto_table_esp
for you.  It is similar to the riscv_all_supported_ext, which collects all
tables of extensions, so we may have a howto_tables to collect howto_table,
howto_table_internal and howto_table_esp, ....  Then define an enum similar
to riscv_prefix_ext_class, which should be passed to
riscv_elf_rtype_to_howto, and then can get the right howto table from
howto_tables with the enum.  We will parse the R_RISCV_VENDOR reloc first,
and then get the vendor id, so the vendor id can be mapped to the right
enum.

       if (rtype == NULL)
>         printf (_("unrecognized: %-7lx"), (unsigned long) type &
> 0xffffffff);
>        else
> @@ -2500,6 +2510,7 @@ dump_relocations (Filedata *          filedata,
>                     sec_name = printable_section_name_from_index
>                       (filedata, psym->st_shndx, NULL);
>
> +                 vendor_id = strdup(sec_name);
>                   print_symbol_name (22, sec_name);
>                 }
>               else if (strtab == NULL)
> @@ -2512,6 +2523,7 @@ dump_relocations (Filedata *          filedata,
>                 }
>               else
>                 {
> +                 vendor_id = strdup(strtab + psym->st_name);
>                   print_symbol_name (22, strtab + psym->st_name);
>                   if (version_string)
>                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
>

The other targets don't have vendor id, so probably can have a better way
to let only riscv do this.


> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
> index 8485ad441f5..a63d4bb0f2e 100644
> --- a/gas/config/tc-riscv.c
> +++ b/gas/config/tc-riscv.c
> @@ -734,6 +734,54 @@ riscv_target_format (void)
>      return xlen == 64 ? "elf64-littleriscv" : "elf32-littleriscv";
>  }
>
> +/* Insert R_RISCV_VENDOR relocation right before the custom relocation
> + * passed in fixP. */
> +static void
> +insert_vendor_relocation (fixS *fixP, segT target_seg, const char
> *vendor_id)
> +{
> +  segT saved_seg;
> +  symbolS *sym;
> +  const flagword vendor_sym_flags = (BSF_NO_FLAGS | BSF_LOCAL);
> +
> +  /* Check if the vendor ID symbol already exists. */
> +  for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
> +    {
> +      /* Ensure we find a local symbol in the desired segment.
> +         This prevents R_RISCV_VENDOR relocation against a global symbol
> +         with the same name, if it exists.  */
> +      if (S_GET_SEGMENT (sym) == target_seg &&
> +         symbol_get_bfdsym (sym)->flags == vendor_sym_flags &&

+         strcmp (S_GET_NAME (sym), vendor_id) == 0)
>

if (S_GET_SEGMENT (sym) == target_seg
    && symbol_get_bfdsym (sym)->flags == vendor_sym_flags
    && strcmp (S_GET_NAME (sym), vendor_id) == 0)


> +       {
> +         break; /* Symbol found.  */
> +       }
> +    }
> +
> +  /* If symbol does not exist, create a new one.  */
> +  if (sym == NULL)
> +    {
> +      sym = symbol_new (vendor_id, target_seg, &zero_address_frag, 0);
> +      symbol_get_bfdsym (sym)->flags = vendor_sym_flags;
> +    }
> +
> +  /* Temporarily switch segment for fix_new().  */
> +  saved_seg = now_seg;
> +  now_seg = target_seg; /* Ensure fix_new_internal() uses the correct
> segment.  */
> +
> +  /* Insert the R_RISCV_VENDOR relocation.  */
> +  /* Since it's not possible to access the previous element in the fixup
> list,
> +     it worked around by calling fix_at_start when 'where == 0'.
> +     Otherwise, place the fix at 'where - 1' to ensure correct ordering of
> +     R_RISCV_VENDOR and R_RISCV_CUSTOM.  */
> +  if (fixP->fx_where == 0)
> +    fix_at_start (fixP->fx_frag, 4, sym, 0, false,
> BFD_RELOC_RISCV_VENDOR);
> +  else
> +    fix_new (fixP->fx_frag, fixP->fx_where - 1, 4, sym, 0, false,
> BFD_RELOC_RISCV_VENDOR);
>

I do not really understand the problem here.  Why not just refer to how the
R_RISCV_RELAX insert?  Just use the xmemdup to copy the fixup, and decide
the R_RISCV_VENDOR should be inserted into the current one or the copied
next one.


> diff --git a/include/elf/riscv.h b/include/elf/riscv.h
> index 2ea1ae82eb6..0f3a5c4ded6 100644
> --- a/include/elf/riscv.h
> +++ b/include/elf/riscv.h
> @@ -95,15 +95,113 @@ START_RELOC_NUMBERS (elf_riscv_reloc_type)
>    RELOC_NUMBER (R_RISCV_TLSDESC_LOAD_LO12, 63)
>    RELOC_NUMBER (R_RISCV_TLSDESC_ADD_LO12, 64)
>    RELOC_NUMBER (R_RISCV_TLSDESC_CALL, 65)
> +  /* update R_RISCV_internal_first if add new reloc.  */
> +
> +  /* Vendor-specific (nonstandard) relocations are defined here only to
> provide
> +     string version names (in readelf).  */
> +  RELOC_NUMBER (R_RISCV_VENDOR, 191)
> +  RELOC_NUMBER (R_RISCV_CUSTOM0, 192)
> +  RELOC_NUMBER (R_RISCV_CUSTOM1, 193)
> +  RELOC_NUMBER (R_RISCV_CUSTOM2, 194)
> +  RELOC_NUMBER (R_RISCV_CUSTOM3, 195)
> +  RELOC_NUMBER (R_RISCV_CUSTOM4, 196)
> +  RELOC_NUMBER (R_RISCV_CUSTOM5, 197)
> +  RELOC_NUMBER (R_RISCV_CUSTOM6, 198)
> +  RELOC_NUMBER (R_RISCV_CUSTOM7, 199)
> +  RELOC_NUMBER (R_RISCV_CUSTOM8, 200)
> +  RELOC_NUMBER (R_RISCV_CUSTOM9, 201)
> +  RELOC_NUMBER (R_RISCV_CUSTOM10, 202)
> +  RELOC_NUMBER (R_RISCV_CUSTOM11, 203)
> +  RELOC_NUMBER (R_RISCV_CUSTOM12, 204)
> +  RELOC_NUMBER (R_RISCV_CUSTOM13, 205)
> +  RELOC_NUMBER (R_RISCV_CUSTOM14, 206)
> +  RELOC_NUMBER (R_RISCV_CUSTOM15, 207)
> +  RELOC_NUMBER (R_RISCV_CUSTOM16, 208)
> +  RELOC_NUMBER (R_RISCV_CUSTOM17, 209)
> +  RELOC_NUMBER (R_RISCV_CUSTOM18, 210)
> +  RELOC_NUMBER (R_RISCV_CUSTOM19, 211)
> +  RELOC_NUMBER (R_RISCV_CUSTOM20, 212)
> +  RELOC_NUMBER (R_RISCV_CUSTOM21, 213)
> +  RELOC_NUMBER (R_RISCV_CUSTOM22, 214)
> +  RELOC_NUMBER (R_RISCV_CUSTOM23, 215)
> +  RELOC_NUMBER (R_RISCV_CUSTOM24, 216)
> +  RELOC_NUMBER (R_RISCV_CUSTOM25, 217)
> +  RELOC_NUMBER (R_RISCV_CUSTOM26, 218)
> +  RELOC_NUMBER (R_RISCV_CUSTOM27, 219)
> +  RELOC_NUMBER (R_RISCV_CUSTOM28, 220)
> +  RELOC_NUMBER (R_RISCV_CUSTOM29, 221)
> +  RELOC_NUMBER (R_RISCV_CUSTOM30, 222)
> +  RELOC_NUMBER (R_RISCV_CUSTOM31, 223)
> +  RELOC_NUMBER (R_RISCV_CUSTOM32, 224)
> +  RELOC_NUMBER (R_RISCV_CUSTOM33, 225)
> +  RELOC_NUMBER (R_RISCV_CUSTOM34, 226)
> +  RELOC_NUMBER (R_RISCV_CUSTOM35, 227)
> +  RELOC_NUMBER (R_RISCV_CUSTOM36, 228)
> +  RELOC_NUMBER (R_RISCV_CUSTOM37, 229)
> +  RELOC_NUMBER (R_RISCV_CUSTOM38, 230)
> +  RELOC_NUMBER (R_RISCV_CUSTOM39, 231)
> +  RELOC_NUMBER (R_RISCV_CUSTOM40, 232)
> +  RELOC_NUMBER (R_RISCV_CUSTOM41, 233)
> +  RELOC_NUMBER (R_RISCV_CUSTOM42, 234)
> +  RELOC_NUMBER (R_RISCV_CUSTOM43, 235)
> +  RELOC_NUMBER (R_RISCV_CUSTOM44, 236)
> +  RELOC_NUMBER (R_RISCV_CUSTOM45, 237)
> +  RELOC_NUMBER (R_RISCV_CUSTOM46, 238)
> +  RELOC_NUMBER (R_RISCV_CUSTOM47, 239)
> +  RELOC_NUMBER (R_RISCV_CUSTOM48, 240)
> +  RELOC_NUMBER (R_RISCV_CUSTOM49, 241)
> +  RELOC_NUMBER (R_RISCV_CUSTOM50, 242)
> +  RELOC_NUMBER (R_RISCV_CUSTOM51, 243)
> +  RELOC_NUMBER (R_RISCV_CUSTOM52, 244)
> +  RELOC_NUMBER (R_RISCV_CUSTOM53, 245)
> +  RELOC_NUMBER (R_RISCV_CUSTOM54, 246)
> +  RELOC_NUMBER (R_RISCV_CUSTOM55, 247)
> +  RELOC_NUMBER (R_RISCV_CUSTOM56, 248)
> +  RELOC_NUMBER (R_RISCV_CUSTOM57, 249)
> +  RELOC_NUMBER (R_RISCV_CUSTOM58, 250)
> +  RELOC_NUMBER (R_RISCV_CUSTOM59, 251)
> +  RELOC_NUMBER (R_RISCV_CUSTOM60, 252)
> +  RELOC_NUMBER (R_RISCV_CUSTOM61, 253)
> +  RELOC_NUMBER (R_RISCV_CUSTOM62, 254)
> +  RELOC_NUMBER (R_RISCV_CUSTOM63, 255)
>

Likewise, these should be unnecessary.


>  END_RELOC_NUMBERS (R_RISCV_max)
>
>  /* Internal relocations used exclusively by the relaxation pass.  */
> -#define R_RISCV_DELETE  (R_RISCV_max)
> -#define R_RISCV_RVC_LUI (R_RISCV_max + 1)
> -#define R_RISCV_GPREL_I (R_RISCV_max + 2)
> -#define R_RISCV_GPREL_S (R_RISCV_max + 3)
> -#define R_RISCV_TPREL_I (R_RISCV_max + 4)
> -#define R_RISCV_TPREL_S (R_RISCV_max + 5)
> +#define R_RISCV_internal_first (R_RISCV_TLSDESC_CALL + 1)
> +#define R_RISCV_DELETE  (R_RISCV_internal_first)
> +#define R_RISCV_RVC_LUI (R_RISCV_internal_first + 1)
> +#define R_RISCV_GPREL_I (R_RISCV_internal_first + 2)
> +#define R_RISCV_GPREL_S (R_RISCV_internal_first + 3)
> +#define R_RISCV_TPREL_I (R_RISCV_internal_first + 4)
> +#define R_RISCV_TPREL_S (R_RISCV_internal_first + 5)


In case one day the internal relocations may be overlapped with the vendor
stuff, I think we only need to define the R_RISCV_internal_first to 256
directly, after the end of vendor relocations.


Thanks
Nelson
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/binutils/attachments/20250410/16877fc9/attachment-0001.htm>


More information about the Binutils mailing list