[ELF] writePlt, writeIplt: replace parameters gotPltEntryAddr and index with `const Symbol &`. NFC
PPC::writeIplt (IPLT code sequence, D71621) needs to access `Symbol`. Reviewed By: grimar, ruiu Differential Revision: https://reviews.llvm.org/D71631
This commit is contained in:
parent
541daa5e6b
commit
37b2808059
|
@ -37,8 +37,8 @@ public:
|
|||
RelType getDynRel(RelType type) const override;
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
|
||||
uint64_t branchAddr, const Symbol &s,
|
||||
int64_t a) const override;
|
||||
|
@ -214,8 +214,8 @@ void AArch64::writePltHeader(uint8_t *buf) const {
|
|||
relocateOne(buf + 12, R_AARCH64_ADD_ABS_LO12_NC, got + 16);
|
||||
}
|
||||
|
||||
void AArch64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
void AArch64::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
const uint8_t inst[] = {
|
||||
0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[n]))
|
||||
0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16, Offset(&(.plt.got[n]))]
|
||||
|
@ -224,6 +224,7 @@ void AArch64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
};
|
||||
memcpy(buf, inst, sizeof(inst));
|
||||
|
||||
uint64_t gotPltEntryAddr = sym.getGotPltVA();
|
||||
relocateOne(buf, R_AARCH64_ADR_PREL_PG_HI21,
|
||||
getAArch64Page(gotPltEntryAddr) - getAArch64Page(pltEntryAddr));
|
||||
relocateOne(buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, gotPltEntryAddr);
|
||||
|
@ -569,8 +570,8 @@ class AArch64BtiPac final : public AArch64 {
|
|||
public:
|
||||
AArch64BtiPac();
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
|
||||
private:
|
||||
bool btiHeader; // bti instruction needed in PLT Header
|
||||
|
@ -631,8 +632,8 @@ void AArch64BtiPac::writePltHeader(uint8_t *buf) const {
|
|||
memcpy(buf + sizeof(pltData), nopData, sizeof(nopData));
|
||||
}
|
||||
|
||||
void AArch64BtiPac::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
void AArch64BtiPac::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
// The PLT entry is of the form:
|
||||
// [btiData] addrInst (pacBr | stdBr) [nopData]
|
||||
const uint8_t btiData[] = { 0x5f, 0x24, 0x03, 0xd5 }; // bti c
|
||||
|
@ -657,6 +658,7 @@ void AArch64BtiPac::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
pltEntryAddr += sizeof(btiData);
|
||||
}
|
||||
|
||||
uint64_t gotPltEntryAddr = sym.getGotPltVA();
|
||||
memcpy(buf, addrInst, sizeof(addrInst));
|
||||
relocateOne(buf, R_AARCH64_ADR_PREL_PG_HI21,
|
||||
getAArch64Page(gotPltEntryAddr) -
|
||||
|
|
|
@ -34,8 +34,8 @@ public:
|
|||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writeIgotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
void addPltSymbols(InputSection &isec, uint64_t off) const override;
|
||||
void addPltHeaderSymbols(InputSection &isd) const override;
|
||||
bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
|
||||
|
@ -231,8 +231,8 @@ static void writePltLong(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
|
||||
// The default PLT entries require the .plt.got to be within 128 Mb of the
|
||||
// .plt in the positive direction.
|
||||
void ARM::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t /*index*/) const {
|
||||
void ARM::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
// The PLT entry is similar to the example given in Appendix A of ELF for
|
||||
// the Arm Architecture. Instead of using the Group Relocations to find the
|
||||
// optimal rotation for the 8-bit immediate used in the add instructions we
|
||||
|
@ -244,10 +244,10 @@ void ARM::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
0xe5bcf000, // ldr pc, [ip, #0x00000NNN] Offset(&(.plt.got) - L1 - 8
|
||||
};
|
||||
|
||||
uint64_t offset = gotPltEntryAddr - pltEntryAddr - 8;
|
||||
uint64_t offset = sym.getGotPltVA() - pltEntryAddr - 8;
|
||||
if (!llvm::isUInt<27>(offset)) {
|
||||
// We cannot encode the Offset, use the long form.
|
||||
writePltLong(buf, gotPltEntryAddr, pltEntryAddr);
|
||||
writePltLong(buf, sym.getGotPltVA(), pltEntryAddr);
|
||||
return;
|
||||
}
|
||||
write32le(buf + 0, pltData[0] | ((offset >> 20) & 0xff));
|
||||
|
|
|
@ -33,8 +33,8 @@ public:
|
|||
RelType getDynRel(RelType type) const override;
|
||||
void relocateOne(uint8_t *loc, RelType type, uint64_t val) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
|
@ -302,8 +302,8 @@ void Hexagon::writePltHeader(uint8_t *buf) const {
|
|||
relocateOne(buf + 4, R_HEX_6_PCREL_X, off);
|
||||
}
|
||||
|
||||
void Hexagon::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
void Hexagon::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
const uint8_t inst[] = {
|
||||
0x00, 0x40, 0x00, 0x00, // { immext (#0)
|
||||
0x0e, 0xc0, 0x49, 0x6a, // r14 = add (pc, ##GOTn@PCREL) }
|
||||
|
@ -312,6 +312,7 @@ void Hexagon::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
};
|
||||
memcpy(buf, inst, sizeof(inst));
|
||||
|
||||
uint64_t gotPltEntryAddr = sym.getGotPltVA();
|
||||
relocateOne(buf, R_HEX_B32_PCREL_X, gotPltEntryAddr - pltEntryAddr);
|
||||
relocateOne(buf + 4, R_HEX_6_PCREL_X, gotPltEntryAddr - pltEntryAddr);
|
||||
}
|
||||
|
|
|
@ -32,8 +32,8 @@ public:
|
|||
RelType getDynRel(RelType type) const override;
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
|
||||
uint64_t branchAddr, const Symbol &s,
|
||||
int64_t a) const override;
|
||||
|
@ -318,8 +318,9 @@ template <class ELFT> void MIPS<ELFT>::writePltHeader(uint8_t *buf) const {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
void MIPS<ELFT>::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t /*index*/) const {
|
||||
void MIPS<ELFT>::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
uint64_t gotPltEntryAddr = sym.getGotPltVA();
|
||||
if (isMicroMips()) {
|
||||
// Overwrite trap instructions written by Writer::writeTrapInstr.
|
||||
memset(buf, 0, pltEntrySize);
|
||||
|
|
|
@ -31,8 +31,8 @@ public:
|
|||
void writePltHeader(uint8_t *buf) const override {
|
||||
llvm_unreachable("should call writePPC32GlinkSection() instead");
|
||||
}
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override {
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override {
|
||||
llvm_unreachable("should call writePPC32GlinkSection() instead");
|
||||
}
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
|
|
|
@ -200,8 +200,8 @@ public:
|
|||
const uint8_t *loc) const override;
|
||||
RelType getDynRel(RelType type) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
void relocateOne(uint8_t *loc, RelType type, uint64_t val) const override;
|
||||
void writeGotHeader(uint8_t *buf) const override;
|
||||
bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
|
||||
|
@ -669,9 +669,9 @@ void PPC64::writePltHeader(uint8_t *buf) const {
|
|||
write64(buf + 52, gotPltOffset);
|
||||
}
|
||||
|
||||
void PPC64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
int32_t offset = pltHeaderSize + index * pltEntrySize;
|
||||
void PPC64::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t /*pltEntryAddr*/) const {
|
||||
int32_t offset = pltHeaderSize + sym.pltIndex * pltEntrySize;
|
||||
// bl __glink_PLTresolve
|
||||
write32(buf, 0x48000000 | ((-offset) & 0x03FFFFFc));
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "InputFiles.h"
|
||||
#include "Symbols.h"
|
||||
#include "SyntheticSections.h"
|
||||
#include "Target.h"
|
||||
|
||||
|
@ -27,8 +28,8 @@ public:
|
|||
void writeGotHeader(uint8_t *buf) const override;
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
RelType getDynRel(RelType type) const override;
|
||||
RelExpr getRelExpr(RelType type, const Symbol &s,
|
||||
const uint8_t *loc) const override;
|
||||
|
@ -163,13 +164,13 @@ void RISCV::writePltHeader(uint8_t *buf) const {
|
|||
write32le(buf + 28, itype(JALR, 0, X_T3, 0));
|
||||
}
|
||||
|
||||
void RISCV::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t /*index*/) const {
|
||||
void RISCV::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
// 1: auipc t3, %pcrel_hi(f@.got.plt)
|
||||
// l[wd] t3, %pcrel_lo(1b)(t3)
|
||||
// jalr t1, t3
|
||||
// nop
|
||||
uint32_t offset = gotPltEntryAddr - pltEntryAddr;
|
||||
uint32_t offset = sym.getGotPltVA() - pltEntryAddr;
|
||||
write32le(buf + 0, utype(AUIPC, X_T3, hi20(offset)));
|
||||
write32le(buf + 4, itype(config->is64 ? LD : LW, X_T3, X_T3, lo12(offset)));
|
||||
write32le(buf + 8, itype(JALR, X_T1, X_T3, 0));
|
||||
|
|
|
@ -26,8 +26,8 @@ public:
|
|||
SPARCV9();
|
||||
RelExpr getRelExpr(RelType type, const Symbol &s,
|
||||
const uint8_t *loc) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
void relocateOne(uint8_t *loc, RelType type, uint64_t val) const override;
|
||||
};
|
||||
} // namespace
|
||||
|
@ -124,8 +124,8 @@ void SPARCV9::relocateOne(uint8_t *loc, RelType type, uint64_t val) const {
|
|||
}
|
||||
}
|
||||
|
||||
void SPARCV9::writePlt(uint8_t *buf, uint64_t gotEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
void SPARCV9::writePlt(uint8_t *buf, const Symbol & /*sym*/,
|
||||
uint64_t pltEntryAddr) const {
|
||||
const uint8_t pltData[] = {
|
||||
0x03, 0x00, 0x00, 0x00, // sethi (. - .PLT0), %g1
|
||||
0x30, 0x68, 0x00, 0x00, // ba,a %xcc, .PLT1
|
||||
|
@ -138,7 +138,7 @@ void SPARCV9::writePlt(uint8_t *buf, uint64_t gotEntryAddr,
|
|||
};
|
||||
memcpy(buf, pltData, sizeof(pltData));
|
||||
|
||||
uint64_t off = pltHeaderSize + pltEntrySize * index;
|
||||
uint64_t off = pltEntryAddr - in.plt->getVA();
|
||||
relocateOne(buf, R_SPARC_22, off);
|
||||
relocateOne(buf + 4, R_SPARC_WDISP19, -(off + 4 - pltEntrySize));
|
||||
}
|
||||
|
|
|
@ -33,8 +33,8 @@ public:
|
|||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writeIgotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
void relocateOne(uint8_t *loc, RelType type, uint64_t val) const override;
|
||||
|
||||
RelExpr adjustRelaxExpr(RelType type, const uint8_t *data,
|
||||
|
@ -214,9 +214,9 @@ void X86::writePltHeader(uint8_t *buf) const {
|
|||
write32le(buf + 8, gotPlt + 8);
|
||||
}
|
||||
|
||||
void X86::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
unsigned relOff = in.relaPlt->entsize * index;
|
||||
void X86::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
unsigned relOff = in.relaPlt->entsize * sym.pltIndex;
|
||||
if (config->isPic) {
|
||||
const uint8_t inst[] = {
|
||||
0xff, 0xa3, 0, 0, 0, 0, // jmp *foo@GOT(%ebx)
|
||||
|
@ -224,7 +224,7 @@ void X86::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
0xe9, 0, 0, 0, 0, // jmp .PLT0@PC
|
||||
};
|
||||
memcpy(buf, inst, sizeof(inst));
|
||||
write32le(buf + 2, gotPltEntryAddr - in.gotPlt->getVA());
|
||||
write32le(buf + 2, sym.getGotPltVA() - in.gotPlt->getVA());
|
||||
} else {
|
||||
const uint8_t inst[] = {
|
||||
0xff, 0x25, 0, 0, 0, 0, // jmp *foo@GOT
|
||||
|
@ -232,7 +232,7 @@ void X86::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
0xe9, 0, 0, 0, 0, // jmp .PLT0@PC
|
||||
};
|
||||
memcpy(buf, inst, sizeof(inst));
|
||||
write32le(buf + 2, gotPltEntryAddr);
|
||||
write32le(buf + 2, sym.getGotPltVA());
|
||||
}
|
||||
|
||||
write32le(buf + 7, relOff);
|
||||
|
@ -416,8 +416,8 @@ public:
|
|||
RetpolinePic();
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
};
|
||||
|
||||
class RetpolineNoPic : public X86 {
|
||||
|
@ -425,8 +425,8 @@ public:
|
|||
RetpolineNoPic();
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
|
@ -461,9 +461,9 @@ void RetpolinePic::writePltHeader(uint8_t *buf) const {
|
|||
memcpy(buf, insn, sizeof(insn));
|
||||
}
|
||||
|
||||
void RetpolinePic::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
unsigned relOff = in.relaPlt->entsize * index;
|
||||
void RetpolinePic::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
unsigned relOff = in.relaPlt->entsize * sym.pltIndex;
|
||||
const uint8_t insn[] = {
|
||||
0x50, // pushl %eax
|
||||
0x8b, 0x83, 0, 0, 0, 0, // mov foo@GOT(%ebx), %eax
|
||||
|
@ -477,7 +477,7 @@ void RetpolinePic::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
|
||||
uint32_t ebx = in.gotPlt->getVA();
|
||||
unsigned off = pltEntryAddr - in.plt->getVA();
|
||||
write32le(buf + 3, gotPltEntryAddr - ebx);
|
||||
write32le(buf + 3, sym.getGotPltVA() - ebx);
|
||||
write32le(buf + 8, -off - 12 + 32);
|
||||
write32le(buf + 13, -off - 17 + 18);
|
||||
write32le(buf + 18, relOff);
|
||||
|
@ -520,9 +520,9 @@ void RetpolineNoPic::writePltHeader(uint8_t *buf) const {
|
|||
write32le(buf + 8, gotPlt + 8);
|
||||
}
|
||||
|
||||
void RetpolineNoPic::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
unsigned relOff = in.relaPlt->entsize * index;
|
||||
void RetpolineNoPic::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
unsigned relOff = in.relaPlt->entsize * sym.pltIndex;
|
||||
const uint8_t insn[] = {
|
||||
0x50, // 0: pushl %eax
|
||||
0xa1, 0, 0, 0, 0, // 1: mov foo_in_GOT, %eax
|
||||
|
@ -536,7 +536,7 @@ void RetpolineNoPic::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
memcpy(buf, insn, sizeof(insn));
|
||||
|
||||
unsigned off = pltEntryAddr - in.plt->getVA();
|
||||
write32le(buf + 2, gotPltEntryAddr);
|
||||
write32le(buf + 2, sym.getGotPltVA());
|
||||
write32le(buf + 7, -off - 11 + 32);
|
||||
write32le(buf + 12, -off - 16 + 17);
|
||||
write32le(buf + 17, relOff);
|
||||
|
|
|
@ -33,8 +33,8 @@ public:
|
|||
void writeGotPltHeader(uint8_t *buf) const override;
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
void relocateOne(uint8_t *loc, RelType type, uint64_t val) const override;
|
||||
|
||||
RelExpr adjustRelaxExpr(RelType type, const uint8_t *data,
|
||||
|
@ -156,8 +156,8 @@ void X86_64::writePltHeader(uint8_t *buf) const {
|
|||
write32le(buf + 8, gotPlt - plt + 4); // GOTPLT+16
|
||||
}
|
||||
|
||||
void X86_64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
void X86_64::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
const uint8_t inst[] = {
|
||||
0xff, 0x25, 0, 0, 0, 0, // jmpq *got(%rip)
|
||||
0x68, 0, 0, 0, 0, // pushq <relocation index>
|
||||
|
@ -165,8 +165,8 @@ void X86_64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
};
|
||||
memcpy(buf, inst, sizeof(inst));
|
||||
|
||||
write32le(buf + 2, gotPltEntryAddr - pltEntryAddr - 6);
|
||||
write32le(buf + 7, index);
|
||||
write32le(buf + 2, sym.getGotPltVA() - pltEntryAddr - 6);
|
||||
write32le(buf + 7, sym.pltIndex);
|
||||
write32le(buf + 12, in.plt->getVA() - pltEntryAddr - 16);
|
||||
}
|
||||
|
||||
|
@ -583,8 +583,8 @@ public:
|
|||
Retpoline();
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
};
|
||||
|
||||
class RetpolineZNow : public X86_64 {
|
||||
|
@ -592,8 +592,8 @@ public:
|
|||
RetpolineZNow();
|
||||
void writeGotPlt(uint8_t *buf, const Symbol &s) const override {}
|
||||
void writePltHeader(uint8_t *buf) const override;
|
||||
void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t pltEntryAddr,
|
||||
int32_t index) const override;
|
||||
void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const override;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
|
@ -629,8 +629,8 @@ void Retpoline::writePltHeader(uint8_t *buf) const {
|
|||
write32le(buf + 9, gotPlt - plt - 13 + 16);
|
||||
}
|
||||
|
||||
void Retpoline::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
void Retpoline::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
const uint8_t insn[] = {
|
||||
0x4c, 0x8b, 0x1d, 0, 0, 0, 0, // 0: mov foo@GOTPLT(%rip), %r11
|
||||
0xe8, 0, 0, 0, 0, // 7: callq plt+0x20
|
||||
|
@ -643,10 +643,10 @@ void Retpoline::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
|
||||
uint64_t off = pltEntryAddr - in.plt->getVA();
|
||||
|
||||
write32le(buf + 3, gotPltEntryAddr - pltEntryAddr - 7);
|
||||
write32le(buf + 3, sym.getGotPltVA() - pltEntryAddr - 7);
|
||||
write32le(buf + 8, -off - 12 + 32);
|
||||
write32le(buf + 13, -off - 17 + 18);
|
||||
write32le(buf + 18, index);
|
||||
write32le(buf + 18, sym.pltIndex);
|
||||
write32le(buf + 23, -off - 27);
|
||||
}
|
||||
|
||||
|
@ -672,8 +672,8 @@ void RetpolineZNow::writePltHeader(uint8_t *buf) const {
|
|||
memcpy(buf, insn, sizeof(insn));
|
||||
}
|
||||
|
||||
void RetpolineZNow::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
void RetpolineZNow::writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
const uint8_t insn[] = {
|
||||
0x4c, 0x8b, 0x1d, 0, 0, 0, 0, // mov foo@GOTPLT(%rip), %r11
|
||||
0xe9, 0, 0, 0, 0, // jmp plt+0
|
||||
|
@ -681,7 +681,7 @@ void RetpolineZNow::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
|
|||
};
|
||||
memcpy(buf, insn, sizeof(insn));
|
||||
|
||||
write32le(buf + 3, gotPltEntryAddr - pltEntryAddr - 7);
|
||||
write32le(buf + 3, sym.getGotPltVA() - pltEntryAddr - 7);
|
||||
write32le(buf + 8, in.plt->getVA() - pltEntryAddr - 12);
|
||||
}
|
||||
|
||||
|
|
|
@ -2470,11 +2470,8 @@ void PltSection::writeTo(uint8_t *buf) {
|
|||
target->writePltHeader(buf);
|
||||
size_t off = headerSize;
|
||||
|
||||
for (size_t i = 0, e = entries.size(); i != e; ++i) {
|
||||
const Symbol *b = entries[i];
|
||||
uint64_t got = b->getGotPltVA();
|
||||
uint64_t plt = this->getVA() + off;
|
||||
target->writePlt(buf + off, got, plt, b->pltIndex);
|
||||
for (const Symbol *sym : entries) {
|
||||
target->writePlt(buf + off, *sym, getVA() + off);
|
||||
off += target->pltEntrySize;
|
||||
}
|
||||
}
|
||||
|
@ -2516,8 +2513,7 @@ IpltSection::IpltSection()
|
|||
void IpltSection::writeTo(uint8_t *buf) {
|
||||
uint32_t off = 0;
|
||||
for (const Symbol *sym : entries) {
|
||||
target->writeIplt(buf + off, sym->getGotPltVA(), getVA() + off,
|
||||
sym->pltIndex);
|
||||
target->writeIplt(buf + off, *sym, getVA() + off);
|
||||
off += target->ipltEntrySize;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,12 +41,12 @@ public:
|
|||
// they are called. This function writes that code.
|
||||
virtual void writePltHeader(uint8_t *buf) const {}
|
||||
|
||||
virtual void writePlt(uint8_t *buf, uint64_t gotEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {}
|
||||
virtual void writeIplt(uint8_t *buf, uint64_t gotEntryAddr,
|
||||
uint64_t pltEntryAddr, int32_t index) const {
|
||||
// All but PPC64 use the same format for .plt and .iplt entries.
|
||||
writePlt(buf, gotEntryAddr, pltEntryAddr, index);
|
||||
virtual void writePlt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {}
|
||||
virtual void writeIplt(uint8_t *buf, const Symbol &sym,
|
||||
uint64_t pltEntryAddr) const {
|
||||
// All but PPC32 and PPC64 use the same format for .plt and .iplt entries.
|
||||
writePlt(buf, sym, pltEntryAddr);
|
||||
}
|
||||
virtual void addPltHeaderSymbols(InputSection &isec) const {}
|
||||
virtual void addPltSymbols(InputSection &isec, uint64_t off) const {}
|
||||
|
|
Loading…
Reference in New Issue