Index: ELF/InputSection.h =================================================================== --- ELF/InputSection.h +++ ELF/InputSection.h @@ -36,7 +36,6 @@ R_GOT_PC, R_MIPS_GOT, R_MIPS_GOT_LOCAL, - R_MIPS_GP0, R_NEG_TLS, R_PAGE_PC, R_PC, Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -206,11 +206,6 @@ case R_RELAX_TLS_IE_TO_LE: case R_RELAX_TLS_LD_TO_LE: return Body.getVA(A); - case R_MIPS_GP0: - // We need to adjust SymVA value in case of R_MIPS_GPREL16/32 - // relocations because they use the following expression to calculate - // the relocation's result for local symbol: S + A + GP0 - G. - return Body.getVA(A) + File.getMipsGp0(); case R_MIPS_GOT_LOCAL: // If relocation against MIPS local symbol requires GOT entry, this entry // should be initialized by 'page address'. This address is high 16-bits Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -620,8 +620,10 @@ if (!Config->Pic || Target->isRelRelative(Type) || Expr == R_PC || Expr == R_SIZE || isAbsolute(Body)) { if (Config->EMachine == EM_MIPS && Body.isLocal() && - (Type == R_MIPS_GPREL16 || Type == R_MIPS_GPREL32)) - Expr = R_MIPS_GP0; + (Type == R_MIPS_GPREL16 || Type == R_MIPS_GPREL32)) { + Expr = R_ABS; + Addend += File.getMipsGp0(); + } C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); continue; }