diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 3bb905370262..9a142284eb2b 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -325,9 +325,12 @@ template void LinkerDriver::link(opt::InputArgList &Args) { if (Config->EMachine == EM_MIPS) { // On MIPS O32 ABI, _gp_disp is a magic symbol designates offset between - // start of function and gp pointer into GOT. Use 'strong' variant of - // the addIgnored to prevent '_gp_disp' substitution. + // start of function and 'gp' pointer into GOT. Config->MipsGpDisp = Symtab.addIgnored("_gp_disp"); + // The __gnu_local_gp is a magic symbol equal to the current value of 'gp' + // pointer. This symbol is used in the code generated by .cpload pseudo-op + // in case of using -mno-shared option. + // https://sourceware.org/ml/binutils/2004-12/msg00094.html Config->MipsLocalGp = Symtab.addIgnored("__gnu_local_gp"); // Define _gp for MIPS. st_value of _gp symbol will be updated by Writer diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 20a1dfbc720a..2c362e7f4287 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -397,8 +397,9 @@ void Writer::scanRelocs( // linking only. continue; if (Body == Config->MipsGpDisp || Body == Config->MipsLocalGp) - // MIPS _gp_disp designates offset between start of function and gp - // pointer into GOT therefore any relocations against it do not require + // MIPS _gp_disp designates offset between start of function and 'gp' + // pointer into GOT. __gnu_local_gp is equal to the current value of + // the 'gp'. Therefore any relocations against them do not require // dynamic relocation. continue; }