diff --git a/elf/arch-ppc64v1.cc b/elf/arch-ppc64v1.cc index 6f3550dff..3a46b469f 100644 --- a/elf/arch-ppc64v1.cc +++ b/elf/arch-ppc64v1.cc @@ -263,7 +263,7 @@ void InputSection::apply_reloc_alloc(Context &ctx, u8 *base) { *(ub16 *)loc = lo(S + A - ctx.dtp_addr); break; case R_PPC64_DTPREL16_LO_DS: - *(ub16 *)loc |= ((S + A - ctx.dtp_addr) & 0x3fff) << 2; + *(ub16 *)loc |= (S + A - ctx.dtp_addr) & 0xfffc; break; case R_PPC64_TPREL16_HA: *(ub16 *)loc = ha(S + A - ctx.tp_addr); diff --git a/elf/arch-ppc64v2.cc b/elf/arch-ppc64v2.cc index b253a1f54..76f37a2fe 100644 --- a/elf/arch-ppc64v2.cc +++ b/elf/arch-ppc64v2.cc @@ -319,6 +319,9 @@ void InputSection::apply_reloc_alloc(Context &ctx, u8 *base) { case R_PPC64_DTPREL16_LO: *(ul16 *)loc = lo(S + A - ctx.dtp_addr); break; + case R_PPC64_DTPREL16_LO_DS: + *(ul16 *)loc |= (S + A - ctx.dtp_addr) & 0xfffc; + break; case R_PPC64_DTPREL34: write34(loc, S + A - ctx.dtp_addr); break; @@ -475,6 +478,7 @@ void InputSection::scan_relocations(Context &ctx) { case R_PPC64_TLSLD: case R_PPC64_DTPREL16_HA: case R_PPC64_DTPREL16_LO: + case R_PPC64_DTPREL16_LO_DS: case R_PPC64_DTPREL34: break; default: