summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Driver.cpp7
-rw-r--r--lld/ELF/Writer.cpp5
2 files changed, 8 insertions, 4 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 3bb90537026..9a142284eb2 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -325,9 +325,12 @@ template <class ELFT> 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 20a1dfbc720..2c362e7f428 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -397,8 +397,9 @@ void Writer<ELFT>::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;
}
OpenPOWER on IntegriCloud