Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -176,33 +176,33 @@ return cast(Sym); } +static Defined *addAbsolute(StringRef Name) { + return cast(Symtab->addDefined(Name, STV_HIDDEN, STT_NOTYPE, 0, 0, + STB_GLOBAL, nullptr, nullptr)); +}; + // The linker is expected to define some symbols depending on // the linking result. This function defines such symbols. void elf::addReservedSymbols() { if (Config->EMachine == EM_MIPS) { - auto Add = [](StringRef Name) { - return cast(Symtab->addDefined(Name, STV_HIDDEN, STT_NOTYPE, 0, - 0, STB_GLOBAL, nullptr, nullptr)); - }; - // Define _gp for MIPS. st_value of _gp symbol will be updated by Writer // so that it points to an absolute address which by default is relative // to GOT. Default offset is 0x7ff0. // See "Global Data Symbols" in Chapter 6 in the following document: // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf - ElfSym::MipsGp = Add("_gp"); + ElfSym::MipsGp = addAbsolute("_gp"); // On MIPS O32 ABI, _gp_disp is a magic symbol designates offset between // start of function and 'gp' pointer into GOT. if (Symtab->find("_gp_disp")) - ElfSym::MipsGpDisp = Add("_gp_disp"); + ElfSym::MipsGpDisp = addAbsolute("_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 if (Symtab->find("__gnu_local_gp")) - ElfSym::MipsLocalGp = Add("__gnu_local_gp"); + ElfSym::MipsLocalGp = addAbsolute("__gnu_local_gp"); } // The Power Architecture 64-bit v2 ABI defines a TableOfContents (TOC) which