Simplify getOffset for synthetic sections.
We had a single symbol using -1 with a synthetic section. It is simpler to just update its value. This is not a big will by itself, but will allow having a simple getOffset for InputSeciton. llvm-svn: 330340
This commit is contained in:
parent
6275a7aa39
commit
aded409325
|
@ -142,12 +142,8 @@ uint64_t SectionBase::getOffset(uint64_t Offset) const {
|
||||||
return Offset == uint64_t(-1) ? OS->Size : Offset;
|
return Offset == uint64_t(-1) ? OS->Size : Offset;
|
||||||
}
|
}
|
||||||
case Regular:
|
case Regular:
|
||||||
|
case Synthetic:
|
||||||
return cast<InputSection>(this->Repl)->OutSecOff + Offset;
|
return cast<InputSection>(this->Repl)->OutSecOff + Offset;
|
||||||
case Synthetic: {
|
|
||||||
auto *IS = cast<InputSection>(this->Repl);
|
|
||||||
// For synthetic sections we treat offset -1 as the end of the section.
|
|
||||||
return IS->OutSecOff + (Offset == uint64_t(-1) ? IS->getSize() : Offset);
|
|
||||||
}
|
|
||||||
case EHFrame:
|
case EHFrame:
|
||||||
// The file crtbeginT.o has relocations pointing to the start of an empty
|
// The file crtbeginT.o has relocations pointing to the start of an empty
|
||||||
// .eh_frame that is known to be the first in the link. It does that to
|
// .eh_frame that is known to be the first in the link. It does that to
|
||||||
|
|
|
@ -38,6 +38,7 @@ Defined *ElfSym::GlobalOffsetTable;
|
||||||
Defined *ElfSym::MipsGp;
|
Defined *ElfSym::MipsGp;
|
||||||
Defined *ElfSym::MipsGpDisp;
|
Defined *ElfSym::MipsGpDisp;
|
||||||
Defined *ElfSym::MipsLocalGp;
|
Defined *ElfSym::MipsLocalGp;
|
||||||
|
Defined *ElfSym::RelaIpltEnd;
|
||||||
|
|
||||||
static uint64_t getSymVA(const Symbol &Sym, int64_t &Addend) {
|
static uint64_t getSymVA(const Symbol &Sym, int64_t &Addend) {
|
||||||
switch (Sym.kind()) {
|
switch (Sym.kind()) {
|
||||||
|
|
|
@ -315,6 +315,9 @@ struct ElfSym {
|
||||||
static Defined *MipsGp;
|
static Defined *MipsGp;
|
||||||
static Defined *MipsGpDisp;
|
static Defined *MipsGpDisp;
|
||||||
static Defined *MipsLocalGp;
|
static Defined *MipsLocalGp;
|
||||||
|
|
||||||
|
// __rela_iplt_end or __rel_iplt_end
|
||||||
|
static Defined *RelaIpltEnd;
|
||||||
};
|
};
|
||||||
|
|
||||||
// A buffer class that is large enough to hold any Symbol-derived
|
// A buffer class that is large enough to hold any Symbol-derived
|
||||||
|
|
|
@ -853,7 +853,8 @@ template <class ELFT> void Writer<ELFT>::addRelIpltSymbols() {
|
||||||
addOptionalRegular(S, InX::RelaIplt, 0, STV_HIDDEN, STB_WEAK);
|
addOptionalRegular(S, InX::RelaIplt, 0, STV_HIDDEN, STB_WEAK);
|
||||||
|
|
||||||
S = Config->IsRela ? "__rela_iplt_end" : "__rel_iplt_end";
|
S = Config->IsRela ? "__rela_iplt_end" : "__rel_iplt_end";
|
||||||
addOptionalRegular(S, InX::RelaIplt, -1, STV_HIDDEN, STB_WEAK);
|
ElfSym::RelaIpltEnd =
|
||||||
|
addOptionalRegular(S, InX::RelaIplt, 0, STV_HIDDEN, STB_WEAK);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class ELFT>
|
template <class ELFT>
|
||||||
|
@ -886,6 +887,9 @@ template <class ELFT> void Writer<ELFT>::setReservedSymbolSections() {
|
||||||
ElfSym::GlobalOffsetTable->Section = GotSection;
|
ElfSym::GlobalOffsetTable->Section = GotSection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ElfSym::RelaIpltEnd)
|
||||||
|
ElfSym::RelaIpltEnd->Value = InX::RelaIplt->getSize();
|
||||||
|
|
||||||
PhdrEntry *Last = nullptr;
|
PhdrEntry *Last = nullptr;
|
||||||
PhdrEntry *LastRO = nullptr;
|
PhdrEntry *LastRO = nullptr;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue