_name(nm),
_fixup1(0, ld::Fixup::k1of1, ld::Fixup::kindStoreTargetAddressARMBranch24, target),
_fixup2(0, ld::Fixup::k1of1, ld::Fixup::kindIslandTarget, finalTarget.atom) {
- if (_s_log) fprintf(stderr, "%s: ARM jump instruction branch island to final target %s\n",
- target->name(), finalTarget.atom->name());
+ if (_s_log) fprintf(stderr, "%p: ARM-to-ARM branch island to final target %s\n",
+ this, finalTarget.atom->name());
}
virtual const ld::File* file() const { return NULL; }
ld::Atom::scopeLinkageUnit, ld::Atom::typeBranchIsland,
ld::Atom::symbolTableIn, false, false, false, ld::Atom::Alignment(2)),
_name(nm),
- _target(target),
- _finalTarget(finalTarget) { }
+ _finalTarget(finalTarget) {
+ if (_s_log) fprintf(stderr, "%p: ARM-to-thumb1 branch island to final target %s\n",
+ this, finalTarget.atom->name());
+ }
virtual const ld::File* file() const { return NULL; }
virtual const char* name() const { return _name; }
int64_t displacement = _finalTarget.atom->finalAddress() + _finalTarget.offset - (this->finalAddress() + 12);
if ( _finalTarget.atom->isThumb() )
displacement |= 1;
- if (_s_log) fprintf(stderr, "%s: 4 ARM instruction jump to final target at 0x%08llX\n",
- _target->name(), _finalTarget.atom->finalAddress());
OSWriteLittleInt32(&buffer[ 0], 0, 0xe59fc004); // ldr ip, pc + 4
OSWriteLittleInt32(&buffer[ 4], 0, 0xe08fc00c); // add ip, pc, ip
OSWriteLittleInt32(&buffer[ 8], 0, 0xe12fff1c); // bx ip
private:
const char* _name;
- const ld::Atom* _target;
TargetAndOffset _finalTarget;
};
_name(nm),
_fixup1(0, ld::Fixup::k1of1, ld::Fixup::kindStoreTargetAddressThumbBranch22, target),
_fixup2(0, ld::Fixup::k1of1, ld::Fixup::kindIslandTarget, finalTarget.atom) {
- if (_s_log) fprintf(stderr, "%s: Thumb jump instruction branch island to final target %s\n",
- target->name(), finalTarget.atom->name());
+ if (_s_log) fprintf(stderr, "%p: Thumb-to-thumb branch island to final target %s\n",
+ this, finalTarget.atom->name());
}
virtual const ld::File* file() const { return NULL; }
_fixup2(0, ld::Fixup::k2of2, ld::Fixup::kindStoreThumbLow16),
_fixup3(4, ld::Fixup::k1of2, ld::Fixup::kindSetTargetAddress, finalTarget.atom),
_fixup4(4, ld::Fixup::k2of2, ld::Fixup::kindStoreThumbHigh16),
- _fixup5(0, ld::Fixup::k1of1, ld::Fixup::kindIslandTarget, finalTarget.atom) { }
+ _fixup5(0, ld::Fixup::k1of1, ld::Fixup::kindIslandTarget, finalTarget.atom) {
+ if (_s_log) fprintf(stderr, "%p: Thumb-to-thumb absolute branch island to final target %s\n",
+ this, finalTarget.atom->name());
+ }
virtual const ld::File* file() const { return NULL; }
virtual const char* name() const { return _name; }
ld::Atom::scopeLinkageUnit, ld::Atom::typeBranchIsland,
ld::Atom::symbolTableIn, false, false, false, ld::Atom::Alignment(2)),
_name(nm),
- _target(target),
- _finalTarget(finalTarget) { }
+ _finalTarget(finalTarget) {
+ if (_s_log) fprintf(stderr, "%p: NoPIC ARM-to-Thumb branch island to final target %s\n",
+ this, finalTarget.atom->name());
+ }
virtual const ld::File* file() const { return NULL; }
virtual const char* name() const { return _name; }
uint32_t targetAddr = _finalTarget.atom->finalAddress();
if ( _finalTarget.atom->isThumb() )
targetAddr |= 1;
- if (_s_log) fprintf(stderr, "%s: 2 ARM instruction jump to final target at 0x%08llX\n",
- _target->name(), _finalTarget.atom->finalAddress());
OSWriteLittleInt32(&buffer[0], 0, 0xe51ff004); // ldr pc, [pc, #-4]
OSWriteLittleInt32(&buffer[4], 0, targetAddr); // .long target-this
}
private:
const char* _name;
- const ld::Atom* _target;
TargetAndOffset _finalTarget;
};