summaryrefslogtreecommitdiffstats
path: root/lld/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib')
-rw-r--r--lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp11
-rw-r--r--lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp7
2 files changed, 11 insertions, 7 deletions
diff --git a/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp b/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
index 16088589b14..963097d3d3f 100644
--- a/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
+++ b/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
@@ -185,8 +185,8 @@ const ArchHandler::StubInfo ArchHandler_arm::_sStubInfoArmPIC = {
0x00, 0xF0, 0x9C, 0xE5, // ldr pc, [ip]
0x00, 0x00, 0x00, 0x00, // L1: .long fFastStubGOTAtom - (helper+16)
0x00, 0x00, 0x00, 0x00 }, // L2: .long dyld_stub_binder - (helper+28)
- { Reference::KindArch::ARM, delta32, 28, 0 },
- { Reference::KindArch::ARM, delta32, 32, 0 }
+ { Reference::KindArch::ARM, delta32, 28, 0xC },
+ { Reference::KindArch::ARM, delta32, 32, 0x04 }
};
const ArchHandler::StubInfo &ArchHandler_arm::stubInfo() {
@@ -548,7 +548,7 @@ ArchHandler_arm::getPairReferenceInfo(const normalized::Relocation &reloc1,
"subtrahend label is not in atom"));
*kind = delta32;
value = clearThumbBit(instruction, *target);
- *addend = value - (toAddress - fromAddress);
+ *addend = (int32_t)(value - (toAddress - fixupAddress));
} else if (funcRel) {
toAddress = reloc1.value;
fromAddress = reloc2.value;
@@ -618,7 +618,6 @@ void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *location,
assert(ref.kindArch() == Reference::KindArch::ARM);
int32_t *loc32 = reinterpret_cast<int32_t *>(location);
int32_t displacement;
- // FIXME: these writes may need a swap.
switch (ref.kindValue()) {
case thumb_b22:
// FIXME
@@ -652,10 +651,10 @@ void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *location,
// FIXME
break;
case pointer32:
- // FIXME
+ write32(*loc32, _swap, targetAddress + ref.addend());
break;
case delta32:
- // FIXME
+ write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend());
break;
case lazyPointer:
case lazyImmediateLocation:
diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
index 17dc4701ca1..9879e2d04ed 100644
--- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
+++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
@@ -951,7 +951,12 @@ void Util::addRebaseAndBindingInfo(const lld::File &atomFile,
}
uint32_t Util::fileFlags() {
- return 0; //FIX ME
+ // FIXME: these need to determined at runtime.
+ if (_context.outputMachOType() == MH_OBJECT) {
+ return MH_SUBSECTIONS_VIA_SYMBOLS;
+ } else {
+ return MH_DYLDLINK | MH_NOUNDEFS | MH_TWOLEVEL;
+ }
}
} // end anonymous namespace
OpenPOWER on IntegriCloud