diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index 702cac3843a4..1398d3335c03 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -930,7 +930,13 @@ static void processRelocAux(InputSectionBase &Sec, RelExpr Expr, RelType Type, } bool CanWrite = (Sec.Flags & SHF_WRITE) || !Config->ZText; if (CanWrite) { - if ((!Sym.IsPreemptible && Type == Target->SymbolicRel) || Expr == R_GOT) { + // FIXME Improve the way we handle absolute relocation types that will + // change to relative relocations. ARM has a relocation type R_ARM_TARGET1 + // that is similar to SymbolicRel. PPC64 may have similar relocation types. + if ((!Sym.IsPreemptible && + (Config->EMachine == EM_ARM || Config->EMachine == EM_PPC64 || + Type == Target->SymbolicRel)) || + Expr == R_GOT) { // If this is a symbolic relocation to a non-preemptable symbol, or an // R_GOT, its address is its link-time value plus load address. Represent // it with a relative relocation.