From: Xi Ruoyao Date: Tue, 20 Sep 2022 06:09:29 +0000 (+0800) Subject: LoongArch: Don't write into GOT for local ifunc X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6224a6c2ead26a04f0b2b8ccf4ff5b817afbb425;p=binutils-gdb.git LoongArch: Don't write into GOT for local ifunc Local ifuncs are always resolved at runtime via R_LARCH_IRELATIVE, so there is no need to write anything into GOT. And when we write the GOT we actually trigger a heap-buffer-overflow: If a and b are different sections, we cannot access something in b with "a->contents + (offset from a)" because "a->contents" and "b->contents" are heap buffers allocated separately, not slices of a large buffer. So stop writing into GOT for local ifunc now. --- diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index ed42b8b6770..af18a8a0168 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -3179,6 +3179,8 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, htab->elf.srelgot, &rela); } h->got.offset |= 1; + bfd_put_NN (output_bfd, relocation, + got->contents + got_off); } } else @@ -3200,10 +3202,9 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } local_got_offsets[r_symndx] |= 1; } + bfd_put_NN (output_bfd, relocation, got->contents + got_off); } - bfd_put_NN (output_bfd, relocation, got->contents + got_off); - relocation = got_off + sec_addr (got); }