aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfnn-loongarch.c
diff options
context:
space:
mode:
authorXi Ruoyao <xry111@xry111.site>2022-09-20 14:09:29 +0800
committerliuzhensong <liuzhensong@loongson.cn>2022-09-20 17:16:05 +0800
commit6224a6c2ead26a04f0b2b8ccf4ff5b817afbb425 (patch)
tree02df20b432fad41fa61a7cc3c7a58b2378d2ec43 /bfd/elfnn-loongarch.c
parent6519cd1a15fda2b67ae3e4ad8a2758615d3e0f9f (diff)
downloadbinutils-6224a6c2ead26a04f0b2b8ccf4ff5b817afbb425.zip
binutils-6224a6c2ead26a04f0b2b8ccf4ff5b817afbb425.tar.gz
binutils-6224a6c2ead26a04f0b2b8ccf4ff5b817afbb425.tar.bz2
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.
Diffstat (limited to 'bfd/elfnn-loongarch.c')
-rw-r--r--bfd/elfnn-loongarch.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index ed42b8b..af18a8a 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);
}