summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86Relocator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/X86/X86Relocator.cpp')
-rw-r--r--lib/Target/X86/X86Relocator.cpp236
1 files changed, 119 insertions, 117 deletions
diff --git a/lib/Target/X86/X86Relocator.cpp b/lib/Target/X86/X86Relocator.cpp
index 6e3234f..8cc916e 100644
--- a/lib/Target/X86/X86Relocator.cpp
+++ b/lib/Target/X86/X86Relocator.cpp
@@ -32,7 +32,7 @@ static
Relocation& helper_DynRel_init(ResolveInfo* pSym,
Fragment& pFrag,
uint64_t pOffset,
- X86Relocator::Type pType,
+ Relocator::Type pType,
X86_32Relocator& pParent)
{
X86_32GNULDBackend& ld_backend = pParent.getTarget();
@@ -65,7 +65,7 @@ helper_use_relative_reloc(const ResolveInfo& pSym,
static
X86_32GOTEntry& helper_GOT_init(Relocation& pReloc,
bool pHasRel,
- X86_32Relocator& pParent)
+ X86_32Relocator& pParent)
{
// rsym - The relocation target symbol
ResolveInfo* rsym = pReloc.symInfo();
@@ -96,13 +96,13 @@ X86_32GOTEntry& helper_GOT_init(Relocation& pReloc,
}
static
-X86Relocator::Address helper_GOT_ORG(X86_32Relocator& pParent)
+Relocator::Address helper_GOT_ORG(X86_32Relocator& pParent)
{
return pParent.getTarget().getGOTPLT().addr();
}
static
-X86Relocator::Address helper_get_GOT_address(Relocation& pReloc,
+Relocator::Address helper_get_GOT_address(Relocation& pReloc,
X86_32Relocator& pParent)
{
X86_32GOTEntry* got_entry = pParent.getSymGOTMap().lookUp(*pReloc.symInfo());
@@ -135,8 +135,8 @@ PLTEntryBase& helper_PLT_init(Relocation& pReloc, X86_32Relocator& pParent)
return *plt_entry;
}
-static
-X86Relocator::Address helper_get_PLT_address(ResolveInfo& pSym, X86_32Relocator& pParent)
+static Relocator::Address
+helper_get_PLT_address(ResolveInfo& pSym, X86_32Relocator& pParent)
{
PLTEntryBase* plt_entry = pParent.getSymPLTMap().lookUp(pSym);
assert(NULL != plt_entry);
@@ -150,7 +150,7 @@ DECL_X86_32_APPLY_RELOC_FUNCS
/// the prototype of applying function
typedef Relocator::Result (*X86_32ApplyFunctionType)(Relocation& pReloc,
- X86_32Relocator& pParent);
+ X86_32Relocator& pParent);
// the table entry of applying functions
struct X86_32ApplyFunctionTriple
@@ -802,36 +802,37 @@ void X86_32Relocator::convertTLSIEtoLE(Relocation& pReloc,
assert(pReloc.type() == llvm::ELF::R_386_TLS_IE);
assert(NULL != pReloc.targetRef().frag());
- // 1. create the fragment references and new relocs
- uint64_t off = pReloc.targetRef().offset();
- if (off >= 4)
- off -= 4;
- else
- off = 0;
-
- FragmentRef* fragref = FragmentRef::Create(*pReloc.targetRef().frag(), off);
- Relocation* reloc = Relocation::Create(X86_32Relocator::R_386_TLS_OPT,
- *fragref,
- 0x0);
+ // 1. create the new relocs
+ Relocation* reloc =
+ Relocation::Create(X86_32Relocator::R_386_TLS_OPT,
+ *FragmentRef::Create(*pReloc.targetRef().frag(),
+ pReloc.targetRef().offset() - 1),
+ 0x0);
// FIXME: should we create a special symbol for the tls opt instead?
reloc->setSymInfo(pReloc.symInfo());
// 2. modify the opcodes to the appropriate ones
uint8_t* op = (reinterpret_cast<uint8_t*>(&reloc->target()));
- off = pReloc.targetRef().offset() - reloc->targetRef().offset() - 1;
- if (op[off] == 0xa1) {
- op[off] = 0xb8;
+ if (op[0] == 0xa1) {
+ op[0] = 0xb8;
} else {
- switch (op[off - 1]) {
+ // create the new reloc (move 1 byte forward).
+ reloc = Relocation::Create(X86_32Relocator::R_386_TLS_OPT,
+ *FragmentRef::Create(*pReloc.targetRef().frag(),
+ pReloc.targetRef().offset() - 2),
+ 0x0);
+ reloc->setSymInfo(pReloc.symInfo());
+ op = (reinterpret_cast<uint8_t*>(&reloc->target()));
+ switch (op[0]) {
case 0x8b:
- assert((op[off] & 0xc7) == 0x05);
- op[off - 1] = 0xc7;
- op[off] = 0xc0 | ((op[off] >> 3) & 7);
+ assert((op[1] & 0xc7) == 0x05);
+ op[0] = 0xc7;
+ op[1] = 0xc0 | ((op[1] >> 3) & 7);
break;
case 0x03:
- assert((op[off] & 0xc7) == 0x05);
- op[off - 1] = 0x81;
- op[off] = 0xc0 | ((op[off] >> 3) & 7);
+ assert((op[1] & 0xc7) == 0x05);
+ op[0] = 0x81;
+ op[1] = 0xc0 | ((op[1] >> 3) & 7);
break;
default:
assert(0);
@@ -840,6 +841,7 @@ void X86_32Relocator::convertTLSIEtoLE(Relocation& pReloc,
}
// 3. insert the new relocs "BEFORE" the original reloc.
+ assert(reloc != NULL);
pSection.getRelocData()->getRelocationList().insert(
RelocData::iterator(pReloc), reloc);
@@ -852,15 +854,15 @@ void X86_32Relocator::convertTLSIEtoLE(Relocation& pReloc,
//================================================//
// R_386_NONE
-X86Relocator::Result none(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result none(Relocation& pReloc, X86_32Relocator& pParent)
{
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_32: S + A
// R_386_16
// R_386_8
-X86Relocator::Result abs(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result abs(Relocation& pReloc, X86_32Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
Relocator::DWord A = pReloc.target() + pReloc.addend();
@@ -876,7 +878,7 @@ X86Relocator::Result abs(Relocation& pReloc, X86_32Relocator& pParent)
// but perform static relocation. (e.g., applying .debug section)
if (0x0 == (llvm::ELF::SHF_ALLOC & target_sect.flag())) {
pReloc.target() = S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// An external symbol may need PLT and dynamic relocation
@@ -890,18 +892,18 @@ X86Relocator::Result abs(Relocation& pReloc, X86_32Relocator& pParent)
if (has_dyn_rel)
if (llvm::ELF::R_386_32 != pReloc.type() ||
(!helper_use_relative_reloc(*rsym, pParent)))
- return X86Relocator::OK;
+ return Relocator::OK;
}
// perform static relocation
pReloc.target() = S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_PC32: S + A - P
// R_386_PC16
// R_386_PC8
-X86Relocator::Result rel(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result rel(Relocation& pReloc, X86_32Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
Relocator::DWord A = pReloc.target() + pReloc.addend();
@@ -917,7 +919,7 @@ X86Relocator::Result rel(Relocation& pReloc, X86_32Relocator& pParent)
// but perform static relocation. (e.g., applying .debug section)
if (0x0 == (llvm::ELF::SHF_ALLOC & target_sect.flag())) {
pReloc.target() = S + A - P;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// An external symbol may need PLT and dynamic relocation
@@ -928,41 +930,41 @@ X86Relocator::Result rel(Relocation& pReloc, X86_32Relocator& pParent)
}
if (has_dyn_rel)
if (!helper_use_relative_reloc(*rsym, pParent))
- return X86Relocator::OK;
+ return Relocator::OK;
}
// perform static relocation
pReloc.target() = S + A - P;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_GOTOFF: S + A - GOT_ORG
-X86Relocator::Result gotoff32(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result gotoff32(Relocation& pReloc, X86_32Relocator& pParent)
{
Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
- X86Relocator::Address S = pReloc.symValue();
+ Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
+ Relocator::Address S = pReloc.symValue();
pReloc.target() = S + A - GOT_ORG;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_GOTPC: GOT_ORG + A - P
-X86Relocator::Result gotpc32(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result gotpc32(Relocation& pReloc, X86_32Relocator& pParent)
{
Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
+ Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
// Apply relocation.
pReloc.target() = GOT_ORG + A - pReloc.place();
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_GOT32: GOT(S) + A - GOT_ORG
-X86Relocator::Result got32(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result got32(Relocation& pReloc, X86_32Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
if (!(rsym->reserved() & (X86Relocator::ReserveGOT)))
- return X86Relocator::BadReloc;
+ return Relocator::BadReloc;
// set up got entry value if the got has no dyn rel or
// the dyn rel is RELATIVE
@@ -971,37 +973,37 @@ X86Relocator::Result got32(Relocation& pReloc, X86_32Relocator& pParent)
if (got_entry->getValue() == X86Relocator::SymVal)
got_entry->setValue(pReloc.symValue());
- X86Relocator::Address GOT_S = helper_get_GOT_address(pReloc, pParent);
+ Relocator::Address GOT_S = helper_get_GOT_address(pReloc, pParent);
Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
+ Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
// Apply relocation.
pReloc.target() = GOT_S + A - GOT_ORG;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_PLT32: PLT(S) + A - P
-X86Relocator::Result plt32(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result plt32(Relocation& pReloc, X86_32Relocator& pParent)
{
// PLT_S depends on if there is a PLT entry.
- X86Relocator::Address PLT_S;
+ Relocator::Address PLT_S;
if ((pReloc.symInfo()->reserved() & X86Relocator::ReservePLT))
PLT_S = helper_get_PLT_address(*pReloc.symInfo(), pParent);
else
PLT_S = pReloc.symValue();
Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address P = pReloc.place();
+ Relocator::Address P = pReloc.place();
pReloc.target() = PLT_S + A - P;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_TLS_GD:
-X86Relocator::Result tls_gd(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result tls_gd(Relocation& pReloc, X86_32Relocator& pParent)
{
// global-dynamic
ResolveInfo* rsym = pReloc.symInfo();
// must reserve two pairs of got and dynamic relocation
if (!(rsym->reserved() & X86Relocator::ReserveGOT))
- return X86Relocator::BadReloc;
+ return Relocator::BadReloc;
ELFFileFormat* file_format = pParent.getTarget().getOutputFormat();
// setup corresponding got and dynamic relocatio entries:
@@ -1018,16 +1020,16 @@ X86Relocator::Result tls_gd(Relocation& pReloc, X86_32Relocator& pParent)
Relocator::DWord A = pReloc.target() + pReloc.addend();
// GOT_OFF - the offset between the got_entry1 and _GLOBAL_OFFSET_TABLE (the
// .got.plt section)
- X86Relocator::Address GOT_OFF =
+ Relocator::Address GOT_OFF =
file_format->getGOT().addr() +
got_entry1->getOffset() -
file_format->getGOTPLT().addr();
pReloc.target() = GOT_OFF + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_TLS_LDM
-X86Relocator::Result tls_ldm(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result tls_ldm(Relocation& pReloc, X86_32Relocator& pParent)
{
// FIXME: no linker optimization for TLS relocation
const X86_32GOTEntry& got_entry = pParent.getTLSModuleID();
@@ -1039,46 +1041,46 @@ X86Relocator::Result tls_ldm(Relocation& pReloc, X86_32Relocator& pParent)
Relocator::DWord A = pReloc.target() + pReloc.addend();
pReloc.target() = GOT_S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_TLS_LDO_32
-X86Relocator::Result tls_ldo_32(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result tls_ldo_32(Relocation& pReloc, X86_32Relocator& pParent)
{
// FIXME: no linker optimization for TLS relocation
Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address S = pReloc.symValue();
+ Relocator::Address S = pReloc.symValue();
pReloc.target() = S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_X86_TLS_IE
-X86Relocator::Result tls_ie(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result tls_ie(Relocation& pReloc, X86_32Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
if (!(rsym->reserved() & X86Relocator::ReserveGOT)) {
- return X86Relocator::BadReloc;
+ return Relocator::BadReloc;
}
// set up the got and dynamic relocation entries if not exist
X86_32GOTEntry* got_entry = pParent.getSymGOTMap().lookUp(*rsym);
assert(NULL != got_entry);
// perform relocation to the absolute address of got_entry
- X86Relocator::Address GOT_S =
- pParent.getTarget().getGOT().addr() + got_entry->getOffset();
+ Relocator::Address GOT_S =
+ pParent.getTarget().getGOT().addr() + got_entry->getOffset();
Relocator::DWord A = pReloc.target() + pReloc.addend();
pReloc.target() = GOT_S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_386_TLS_GOTIE
-X86Relocator::Result tls_gotie(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result tls_gotie(Relocation& pReloc, X86_32Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
if (!(rsym->reserved() & X86Relocator::ReserveGOT)) {
- return X86Relocator::BadReloc;
+ return Relocator::BadReloc;
}
// set up the got and dynamic relocation entries if not exist
@@ -1091,14 +1093,14 @@ X86Relocator::Result tls_gotie(Relocation& pReloc, X86_32Relocator& pParent)
Relocator::DWord A = pReloc.target() + pReloc.addend();
pReloc.target() = GOT_S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_X86_TLS_LE
-X86Relocator::Result tls_le(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result tls_le(Relocation& pReloc, X86_32Relocator& pParent)
{
if (pReloc.symInfo()->reserved() & X86Relocator::ReserveRel)
- return X86Relocator::OK;
+ return Relocator::OK;
// perform static relocation
// get TLS segment
@@ -1108,14 +1110,14 @@ X86Relocator::Result tls_le(Relocation& pReloc, X86_32Relocator& pParent)
0x0);
assert(tls_seg != pParent.getTarget().elfSegmentTable().end());
Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address S = pReloc.symValue();
+ Relocator::Address S = pReloc.symValue();
pReloc.target() = S + A - (*tls_seg)->memsz();
- return X86Relocator::OK;
+ return Relocator::OK;
}
-X86Relocator::Result unsupport(Relocation& pReloc, X86_32Relocator& pParent)
+Relocator::Result unsupport(Relocation& pReloc, X86_32Relocator& pParent)
{
- return X86Relocator::Unsupport;
+ return Relocator::Unsupport;
}
//===--------------------------------------------------------------------===//
@@ -1126,7 +1128,7 @@ static
Relocation& helper_DynRel_init(ResolveInfo* pSym,
Fragment& pFrag,
uint64_t pOffset,
- X86Relocator::Type pType,
+ Relocator::Type pType,
X86_64Relocator& pParent)
{
X86_64GNULDBackend& ld_backend = pParent.getTarget();
@@ -1193,14 +1195,14 @@ X86_64GOTEntry& helper_GOT_init(Relocation& pReloc,
}
static
-X86Relocator::Address helper_GOT_ORG(X86_64Relocator& pParent)
+Relocator::Address helper_GOT_ORG(X86_64Relocator& pParent)
{
return pParent.getTarget().getGOT().addr();
}
static
-X86Relocator::Address helper_get_GOT_address(Relocation& pReloc,
- X86_64Relocator& pParent)
+Relocator::Address helper_get_GOT_address(Relocation& pReloc,
+ X86_64Relocator& pParent)
{
X86_64GOTEntry* got_entry = pParent.getSymGOTMap().lookUp(*pReloc.symInfo());
assert(NULL != got_entry);
@@ -1208,8 +1210,8 @@ X86Relocator::Address helper_get_GOT_address(Relocation& pReloc,
}
static
-X86Relocator::Address helper_get_PLT_address(ResolveInfo& pSym,
- X86_64Relocator& pParent)
+Relocator::Address helper_get_PLT_address(ResolveInfo& pSym,
+ X86_64Relocator& pParent)
{
PLTEntryBase* plt_entry = pParent.getSymPLTMap().lookUp(pSym);
assert(NULL != plt_entry);
@@ -1248,7 +1250,7 @@ DECL_X86_64_APPLY_RELOC_FUNCS
/// the prototype of applying function
typedef Relocator::Result (*X86_64ApplyFunctionType)(Relocation& pReloc,
- X86_64Relocator& pParent);
+ X86_64Relocator& pParent);
// the table entry of applying functions
struct X86_64ApplyFunctionTriple
@@ -1426,7 +1428,7 @@ void X86_64Relocator::scanGlobalReloc(Relocation& pReloc,
*this);
getRelRelMap().record(pReloc, reloc);
}
- getTarget().checkAndSetHasTextRel(*pSection.getLink());
+ getTarget().checkAndSetHasTextRel(*pSection.getLink());
}
}
return;
@@ -1497,12 +1499,12 @@ void X86_64Relocator::scanGlobalReloc(Relocation& pReloc,
// All other dynamic relocations may lead to run-time relocation
// overflow.
if (getTarget().isDynamicSymbol(*rsym) &&
- getTarget().symbolNeedsDynRel(*rsym,
+ getTarget().symbolNeedsDynRel(*rsym,
(rsym->reserved() & ReservePLT),
false) &&
- getTarget().symbolNeedsCopyReloc(pReloc, *rsym)) {
- LDSymbol& cpy_sym = defineSymbolforCopyReloc(pBuilder, *rsym, getTarget());
- addCopyReloc(*cpy_sym.resolveInfo(), getTarget());
+ getTarget().symbolNeedsCopyReloc(pReloc, *rsym)) {
+ LDSymbol& cpy_sym = defineSymbolforCopyReloc(pBuilder, *rsym, getTarget());
+ addCopyReloc(*cpy_sym.resolveInfo(), getTarget());
}
return;
@@ -1517,16 +1519,16 @@ void X86_64Relocator::scanGlobalReloc(Relocation& pReloc,
//
// ===
// R_X86_64_NONE
-X86Relocator::Result none(Relocation& pReloc, X86_64Relocator& pParent)
+Relocator::Result none(Relocation& pReloc, X86_64Relocator& pParent)
{
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_X86_64_64: S + A
// R_X86_64_32:
// R_X86_64_16:
// R_X86_64_8
-X86Relocator::Result abs(Relocation& pReloc, X86_64Relocator& pParent)
+Relocator::Result abs(Relocation& pReloc, X86_64Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
Relocator::DWord A = pReloc.target() + pReloc.addend();
@@ -1539,13 +1541,13 @@ X86Relocator::Result abs(Relocation& pReloc, X86_64Relocator& pParent)
// but perform static relocation. (e.g., applying .debug section)
if (0x0 == (llvm::ELF::SHF_ALLOC & target_sect.flag())) {
pReloc.target() = S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// A local symbol may need RELA Type dynamic relocation
if (rsym->isLocal() && has_dyn_rel) {
dyn_rel->setAddend(S + A);
- return X86Relocator::OK;
+ return Relocator::OK;
}
// An external symbol may need PLT and dynamic relocation
@@ -1563,18 +1565,18 @@ X86Relocator::Result abs(Relocation& pReloc, X86_64Relocator& pParent)
}
else {
dyn_rel->setAddend(A);
- return X86Relocator::OK;
+ return Relocator::OK;
}
}
}
// perform static relocation
pReloc.target() = S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_X86_64_32S: S + A
-X86Relocator::Result signed32(Relocation& pReloc, X86_64Relocator& pParent)
+Relocator::Result signed32(Relocation& pReloc, X86_64Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
Relocator::DWord A = pReloc.target() + pReloc.addend();
@@ -1582,7 +1584,7 @@ X86Relocator::Result signed32(Relocation& pReloc, X86_64Relocator& pParent)
// There should be no dynamic relocations for R_X86_64_32S.
if (NULL != pParent.getRelRelMap().lookUp(pReloc))
- return X86Relocator::BadReloc;
+ return Relocator::BadReloc;
LDSection& target_sect = pReloc.targetRef().frag()->getParent()->getSection();
// If the flag of target section is not ALLOC, we will not scan this relocation
@@ -1596,19 +1598,19 @@ X86Relocator::Result signed32(Relocation& pReloc, X86_64Relocator& pParent)
// Check 32-bit signed overflow.
Relocator::SWord V = S + A;
if (V > INT64_C(0x7fffffff) || V < INT64_C(-0x80000000))
- return X86Relocator::Overflow;
+ return Relocator::Overflow;
#endif
// perform static relocation
pReloc.target() = S + A;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_X86_64_GOTPCREL: GOT(S) + GOT_ORG + A - P
-X86Relocator::Result gotpcrel(Relocation& pReloc, X86_64Relocator& pParent)
+Relocator::Result gotpcrel(Relocation& pReloc, X86_64Relocator& pParent)
{
if (!(pReloc.symInfo()->reserved() & X86Relocator::ReserveGOT)) {
- return X86Relocator::BadReloc;
+ return Relocator::BadReloc;
}
// set symbol value of the got entry if needed
@@ -1622,33 +1624,33 @@ X86Relocator::Result gotpcrel(Relocation& pReloc, X86_64Relocator& pParent)
dyn_rel->setAddend(pReloc.symValue());
}
- X86Relocator::Address GOT_S = helper_get_GOT_address(pReloc, pParent);
- Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
+ Relocator::Address GOT_S = helper_get_GOT_address(pReloc, pParent);
+ Relocator::DWord A = pReloc.target() + pReloc.addend();
+ Relocator::Address GOT_ORG = helper_GOT_ORG(pParent);
// Apply relocation.
pReloc.target() = GOT_S + GOT_ORG + A - pReloc.place();
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_X86_64_PLT32: PLT(S) + A - P
-X86Relocator::Result plt32(Relocation& pReloc, X86_64Relocator& pParent)
+Relocator::Result plt32(Relocation& pReloc, X86_64Relocator& pParent)
{
// PLT_S depends on if there is a PLT entry.
- X86Relocator::Address PLT_S;
+ Relocator::Address PLT_S;
if ((pReloc.symInfo()->reserved() & X86Relocator::ReservePLT))
PLT_S = helper_get_PLT_address(*pReloc.symInfo(), pParent);
else
PLT_S = pReloc.symValue();
- Relocator::DWord A = pReloc.target() + pReloc.addend();
- X86Relocator::Address P = pReloc.place();
+ Relocator::DWord A = pReloc.target() + pReloc.addend();
+ Relocator::Address P = pReloc.place();
pReloc.target() = PLT_S + A - P;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// R_X86_64_PC32: S + A - P
// R_X86_64_PC16
// R_X86_64_PC8
-X86Relocator::Result rel(Relocation& pReloc, X86_64Relocator& pParent)
+Relocator::Result rel(Relocation& pReloc, X86_64Relocator& pParent)
{
ResolveInfo* rsym = pReloc.symInfo();
Relocator::DWord A = pReloc.target() + pReloc.addend();
@@ -1660,7 +1662,7 @@ X86Relocator::Result rel(Relocation& pReloc, X86_64Relocator& pParent)
// but perform static relocation. (e.g., applying .debug section)
if (0x0 == (llvm::ELF::SHF_ALLOC & target_sect.flag())) {
pReloc.target() = S + A - P;
- return X86Relocator::OK;
+ return Relocator::OK;
}
// setup relocation addend if needed
@@ -1678,16 +1680,16 @@ X86Relocator::Result rel(Relocation& pReloc, X86_64Relocator& pParent)
*rsym,
(rsym->reserved() & X86Relocator::ReservePLT),
false)) {
- return X86Relocator::Overflow;
+ return Relocator::Overflow;
}
}
// perform static relocation
pReloc.target() = S + A - P;
- return X86Relocator::OK;
+ return Relocator::OK;
}
-X86Relocator::Result unsupport(Relocation& pReloc, X86_64Relocator& pParent)
+Relocator::Result unsupport(Relocation& pReloc, X86_64Relocator& pParent)
{
- return X86Relocator::Unsupport;
+ return Relocator::Unsupport;
}