https://sourceware.org/bugzilla/show_bug.cgi?id=24673

--- Comment #2 from Jim Wilson <wilson at gcc dot gnu.org> ---
The issue with the R_RISCV_NONE appears to be that we are pre-allocating space
for dynamic relocs, and accidentally allocating one more than we need.  This
space is apparently cleared someplace.  So it ends up looking like we have a
R_RISCV_NONE reloc in the extra unused reloc space.

The exact sequence appears to be we have a R_RISCV_TLS_GD_HI20 reloc, which
generates a call to riscv_elf_record_got_reference, which increments
elf_local_got_refcounts.  It also calls riscv_elf_record_tls_type which sets
the tls type to GOT_TLS_TD.  Then in riscv_elf_size_dynamic_sections, the fact
that local_got was set for a symbol, and the fact that the tls type is
GOT_TLS_TD, causes us to add one reloc to the srelgot size.  But we never write
a reloc into that space, so that ends up being the mysterious R_RISCV_NONE at
the end.

Fixing this looks complicated, and may need a rewrite to allocate space for
relocs when we actually generate relocs.  It looks like the MIPS port works
this way with the mips_elf_allocate_dynamic_relocations calls scattered around
the code.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
bug-binutils mailing list
bug-binutils@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-binutils

Reply via email to