forked from OSchip/llvm-project
Use DefinedSynthetic for _gp* symbols.
The test changes to put _gp* in the .got section matches what both bfd and gold do. llvm-svn: 266067
This commit is contained in:
parent
97f0dcdea8
commit
6f92e14ce2
|
@ -403,10 +403,10 @@ template <class ELFT> struct ElfSym {
|
|||
static DefinedRegular<ELFT> *End2;
|
||||
|
||||
// The content for _gp symbol for MIPS target.
|
||||
static DefinedRegular<ELFT> *MipsGp;
|
||||
static SymbolBody *MipsGp;
|
||||
|
||||
static DefinedRegular<ELFT> *MipsLocalGp;
|
||||
static DefinedRegular<ELFT> *MipsGpDisp;
|
||||
static SymbolBody *MipsLocalGp;
|
||||
static SymbolBody *MipsGpDisp;
|
||||
|
||||
// __rel_iplt_start/__rel_iplt_end for signaling
|
||||
// where R_[*]_IRELATIVE relocations do live.
|
||||
|
@ -420,9 +420,9 @@ template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::Edata;
|
|||
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::Edata2;
|
||||
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::End;
|
||||
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::End2;
|
||||
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::MipsGp;
|
||||
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::MipsLocalGp;
|
||||
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::MipsGpDisp;
|
||||
template <class ELFT> SymbolBody *ElfSym<ELFT>::MipsGp;
|
||||
template <class ELFT> SymbolBody *ElfSym<ELFT>::MipsLocalGp;
|
||||
template <class ELFT> SymbolBody *ElfSym<ELFT>::MipsGpDisp;
|
||||
template <class ELFT> SymbolBody *ElfSym<ELFT>::RelaIpltStart;
|
||||
template <class ELFT> SymbolBody *ElfSym<ELFT>::RelaIpltEnd;
|
||||
|
||||
|
|
|
@ -1920,8 +1920,7 @@ bool MipsTargetInfo<ELFT>::isRelRelative(uint32_t Type) const {
|
|||
// a location that is relative to GOT. This function returns
|
||||
// the value for the symbol.
|
||||
template <class ELFT> typename ELFT::uint getMipsGpAddr() {
|
||||
unsigned GPOffset = 0x7ff0;
|
||||
return Out<ELFT>::Got->getVA() + GPOffset;
|
||||
return Out<ELFT>::Got->getVA() + MipsGPOffset;
|
||||
}
|
||||
|
||||
template uint32_t getMipsGpAddr<ELF32LE>();
|
||||
|
|
|
@ -119,6 +119,7 @@ private:
|
|||
|
||||
uint64_t getPPC64TocBase();
|
||||
|
||||
const unsigned MipsGPOffset = 0x7ff0;
|
||||
template <class ELFT> typename ELFT::uint getMipsGpAddr();
|
||||
|
||||
extern TargetInfo *Target;
|
||||
|
|
|
@ -795,6 +795,16 @@ bool Writer<ELFT>::isDiscarded(InputSectionBase<ELFT> *S) const {
|
|||
Script->isDiscarded(S);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
static SymbolBody *
|
||||
addOptionalSynthetic(SymbolTable<ELFT> &Table, StringRef Name,
|
||||
OutputSectionBase<ELFT> &Sec, typename ELFT::uint Val,
|
||||
uint8_t Visibility) {
|
||||
if (!Table.find(Name))
|
||||
return nullptr;
|
||||
return Table.addSynthetic(Name, Sec, Val, Visibility);
|
||||
}
|
||||
|
||||
// The beginning and the ending of .rel[a].plt section are marked
|
||||
// with __rel[a]_iplt_{start,end} symbols if it is a statically linked
|
||||
// executable. The runtime needs these symbols in order to resolve
|
||||
|
@ -806,14 +816,13 @@ void Writer<ELFT>::addRelIpltSymbols() {
|
|||
if (isOutputDynamic() || !Out<ELFT>::RelaPlt)
|
||||
return;
|
||||
StringRef S = Config->Rela ? "__rela_iplt_start" : "__rel_iplt_start";
|
||||
if (Symtab.find(S))
|
||||
ElfSym<ELFT>::RelaIpltStart =
|
||||
Symtab.addSynthetic(S, *Out<ELFT>::RelaPlt, 0, STV_HIDDEN);
|
||||
ElfSym<ELFT>::RelaIpltStart =
|
||||
addOptionalSynthetic(Symtab, S, *Out<ELFT>::RelaPlt, 0, STV_HIDDEN);
|
||||
|
||||
S = Config->Rela ? "__rela_iplt_end" : "__rel_iplt_end";
|
||||
if (Symtab.find(S))
|
||||
ElfSym<ELFT>::RelaIpltEnd = Symtab.addSynthetic(
|
||||
S, *Out<ELFT>::RelaPlt, DefinedSynthetic<ELFT>::SectionEnd, STV_HIDDEN);
|
||||
ElfSym<ELFT>::RelaIpltEnd =
|
||||
addOptionalSynthetic(Symtab, S, *Out<ELFT>::RelaPlt,
|
||||
DefinedSynthetic<ELFT>::SectionEnd, STV_HIDDEN);
|
||||
}
|
||||
|
||||
template <class ELFT> static bool includeInSymtab(const SymbolBody &B) {
|
||||
|
@ -932,16 +941,19 @@ template <class ELFT> void Writer<ELFT>::addReservedSymbols() {
|
|||
// so that it points to an absolute address which is relative to GOT.
|
||||
// See "Global Data Symbols" in Chapter 6 in the following document:
|
||||
// ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
|
||||
ElfSym<ELFT>::MipsGp = Symtab.addAbsolute("_gp", STV_DEFAULT);
|
||||
ElfSym<ELFT>::MipsGp =
|
||||
Symtab.addSynthetic("_gp", *Out<ELFT>::Got, MipsGPOffset, STV_DEFAULT);
|
||||
|
||||
// On MIPS O32 ABI, _gp_disp is a magic symbol designates offset between
|
||||
// start of function and 'gp' pointer into GOT.
|
||||
ElfSym<ELFT>::MipsGpDisp = Symtab.addIgnored("_gp_disp");
|
||||
ElfSym<ELFT>::MipsGpDisp = addOptionalSynthetic(
|
||||
Symtab, "_gp_disp", *Out<ELFT>::Got, MipsGPOffset, STV_HIDDEN);
|
||||
// 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
|
||||
ElfSym<ELFT>::MipsLocalGp = Symtab.addIgnored("__gnu_local_gp");
|
||||
ElfSym<ELFT>::MipsLocalGp = addOptionalSynthetic(
|
||||
Symtab, "__gnu_local_gp", *Out<ELFT>::Got, MipsGPOffset, STV_HIDDEN);
|
||||
}
|
||||
|
||||
// In the assembly for 32 bit x86 the _GLOBAL_OFFSET_TABLE_ symbol
|
||||
|
@ -1515,16 +1527,6 @@ static uint16_t getELFType() {
|
|||
// to each section. This function fixes some predefined absolute
|
||||
// symbol values that depend on section address and size.
|
||||
template <class ELFT> void Writer<ELFT>::fixAbsoluteSymbols() {
|
||||
// Update MIPS _gp absolute symbol so that it points to the static data.
|
||||
|
||||
if (Config->EMachine == EM_MIPS) {
|
||||
ElfSym<ELFT>::MipsGp->Value = getMipsGpAddr<ELFT>();
|
||||
if (ElfSym<ELFT>::MipsLocalGp)
|
||||
ElfSym<ELFT>::MipsLocalGp->Value = getMipsGpAddr<ELFT>();
|
||||
if (ElfSym<ELFT>::MipsGpDisp)
|
||||
ElfSym<ELFT>::MipsGpDisp->Value = getMipsGpAddr<ELFT>();
|
||||
}
|
||||
|
||||
// _etext is the first location after the last read-only loadable segment.
|
||||
// _edata is the first location after the last read-write loadable segment.
|
||||
// _end is the first location after the uninitialized data region.
|
||||
|
|
|
@ -219,7 +219,7 @@ __start:
|
|||
# CHECK-NEXT: Binding: Global
|
||||
# CHECK-NEXT: Type: None (0x0)
|
||||
# CHECK-NEXT: Other: 0
|
||||
# CHECK-NEXT: Section: Absolute (0xFFF1)
|
||||
# CHECK-NEXT: Section: .got
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: ProgramHeaders [
|
||||
|
|
|
@ -48,7 +48,7 @@ v1:
|
|||
# EXE_SYM: .got 0000000c 0000000000030000 DATA
|
||||
# EXE_SYM: SYMBOL TABLE:
|
||||
# EXE_SYM: 00040000 g .data 00000004 v1
|
||||
# EXE_SYM: 00037ff0 *ABS* 00000000 _gp
|
||||
# EXE_SYM: 00037ff0 .got 00000000 _gp
|
||||
# ^-- .got + GP offset (0x7ff0)
|
||||
|
||||
|
||||
|
@ -72,7 +72,7 @@ v1:
|
|||
# DSO_SYM: .got 0000000c 0000000000020000 DATA
|
||||
# DSO_SYM: SYMBOL TABLE:
|
||||
# DSO_SYM: 00030000 g .data 00000004 v1
|
||||
# DSO_SYM: 00027ff0 *ABS* 00000000 _gp
|
||||
# DSO_SYM: 00027ff0 .got 00000000 _gp
|
||||
# ^-- .got + GP offset (0x7ff0)
|
||||
|
||||
# DSO_GOT_BE: Contents of section .got:
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
# DIS-NEXT: 10000: 3c 08 00 01 lui $8, 1
|
||||
# DIS-NEXT: 10004: 21 08 7f f0 addi $8, $8, 32752
|
||||
# ^-- 0x37ff0 & 0xffff
|
||||
# DIS: 00027ff0 *ABS* 00000000 _gp
|
||||
# DIS: 00027ff0 .got 00000000 _gp
|
||||
|
||||
# REL: Relocations [
|
||||
# REL-NEXT: ]
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
# CHECK-NEXT: 20000: 3c 08 00 03 lui $8, 3
|
||||
# CHECK-NEXT: 20004: 21 08 7f f0 addi $8, $8, 32752
|
||||
|
||||
# CHECK: 00037ff0 *ABS* 00000000 _gp
|
||||
# CHECK: 00037ff0 .got 00000000 _gp
|
||||
|
||||
.text
|
||||
.globl __start
|
||||
|
|
|
@ -28,4 +28,4 @@ v1:
|
|||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK: 00010008 .text 00000000 bar
|
||||
# CHECK: 00010004 .text 00000000 foo
|
||||
# CHECK: 00027ff0 *ABS* 00000000 _gp
|
||||
# CHECK: 00027ff0 .got 00000000 _gp
|
||||
|
|
|
@ -27,7 +27,7 @@ __start:
|
|||
# EXE: SYMBOL TABLE:
|
||||
# EXE: 00020000 .text 00000000 __start
|
||||
# EXE: 00020010 .text 00000000 _foo
|
||||
# EXE: 00037ff0 *ABS* 00000000 _gp
|
||||
# EXE: 00037ff0 .got 00000000 _gp
|
||||
|
||||
# SO: Disassembly of section .text:
|
||||
# SO-NEXT: __start:
|
||||
|
@ -39,4 +39,4 @@ __start:
|
|||
# SO: SYMBOL TABLE:
|
||||
# SO: 00010000 .text 00000000 __start
|
||||
# SO: 00010010 .text 00000000 _foo
|
||||
# SO: 00027ff0 *ABS* 00000000 _gp
|
||||
# SO: 00027ff0 .got 00000000 _gp
|
||||
|
|
Loading…
Reference in New Issue