[PATCH] RISC-V: Segment fault for kernel purgatory when linking.
Nelson Chu
nelson@rivosinc.com
Mon May 27 17:44:12 GMT 2024
Committed, thanks.
Nelson
On Tue, Apr 30, 2024 at 1:43 PM Nelson Chu <nelson@rivosinc.com> wrote:
> Reported by Ard Biesheuvel, the followings are reproduce steps,
> https://lore.kernel.org/all/202404260640.9GQVTmrw-lkp@intel.com/T/#u
>
> The segment fault happens in the riscv_elf_finish_dynamic_sections when the
> output got section is an ABS. Refer to MIPS code, they added an extra
> bfd_is_abs_section check to avoid ABS got, so this seems the right and
> easier
> way to go in the short-term.
>
> bfd/
> * elfnn-riscv.c (riscv_elf_finish_dynamic_sections): Set sh_entsize
> and fill the got entries only when the got isn't an ABS section,
> and
> the size of got is larger than zero. The similar goes for gotplt,
> except we already reported error when the gotplt is an ABS.
> ---
> bfd/elfnn-riscv.c | 23 ++++++++++-------------
> 1 file changed, 10 insertions(+), 13 deletions(-)
>
> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
> index 95abf2d10e2..1ecfed82972 100644
> --- a/bfd/elfnn-riscv.c
> +++ b/bfd/elfnn-riscv.c
> @@ -3569,7 +3569,7 @@ riscv_elf_finish_dynamic_sections (bfd *output_bfd,
> }
> }
>
> - if (htab->elf.sgotplt)
> + if (htab->elf.sgotplt && htab->elf.sgotplt->size > 0)
> {
> asection *output_section = htab->elf.sgotplt->output_section;
>
> @@ -3580,31 +3580,28 @@ riscv_elf_finish_dynamic_sections (bfd *output_bfd,
> return false;
> }
>
> - if (htab->elf.sgotplt->size > 0)
> - {
> - /* Write the first two entries in .got.plt, needed for the
> dynamic
> - linker. */
> - bfd_put_NN (output_bfd, (bfd_vma) -1,
> htab->elf.sgotplt->contents);
> - bfd_put_NN (output_bfd, (bfd_vma) 0,
> - htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
> - }
> + /* Write the first two entries in .got.plt, needed for the dynamic
> + linker. */
> + bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
> + bfd_put_NN (output_bfd, (bfd_vma) 0,
> + htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
>
> elf_section_data (output_section)->this_hdr.sh_entsize =
> GOT_ENTRY_SIZE;
> }
>
> - if (htab->elf.sgot)
> + if (htab->elf.sgot && htab->elf.sgot->size > 0)
> {
> asection *output_section = htab->elf.sgot->output_section;
>
> - if (htab->elf.sgot->size > 0)
> + if (!bfd_is_abs_section (output_section))
> {
> /* Set the first entry in the global offset table to the address
> of
> the dynamic section. */
> bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
> bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
> - }
>
> - elf_section_data (output_section)->this_hdr.sh_entsize =
> GOT_ENTRY_SIZE;
> + elf_section_data (output_section)->this_hdr.sh_entsize =
> GOT_ENTRY_SIZE;
> + }
> }
>
> /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
> --
> 2.39.3 (Apple Git-146)
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/binutils/attachments/20240528/0a179e5e/attachment.htm>
More information about the Binutils
mailing list