uint64_t fileSize() const { return _fileSize; }
- bool hasWeakExternalSymbols;
bool usesWeakExternalSymbols;
bool overridesWeakExternalSymbols;
bool _noReExportedDylibs;
- bool hasThreadLocalVariableDefinitions;
bool pieDisabled;
bool hasDataInCode;
ld::Internal::FinalSection* headerAndLoadCommandsSection;
ld::Internal::FinalSection* splitSegInfoSection;
ld::Internal::FinalSection* functionStartsSection;
ld::Internal::FinalSection* dataInCodeSection;
- ld::Internal::FinalSection* dependentDRsSection;
+ ld::Internal::FinalSection* optimizationHintsSection;
ld::Internal::FinalSection* symbolTableSection;
ld::Internal::FinalSection* stringPoolSection;
ld::Internal::FinalSection* localRelocationsSection;
};
struct SplitSegInfoEntry {
- SplitSegInfoEntry(uint64_t a, ld::Fixup::Kind k, uint32_t e=0) : address(a), kind(k), extra(e) {}
- uint64_t address;
+ SplitSegInfoEntry(uint64_t a, ld::Fixup::Kind k, uint32_t e=0)
+ : fixupAddress(a), kind(k), extra(e) {}
+ uint64_t fixupAddress;
ld::Fixup::Kind kind;
uint32_t extra;
};
+ struct SplitSegInfoV2Entry {
+ SplitSegInfoV2Entry(uint8_t fi, uint64_t fo, uint8_t ti, uint64_t to, uint8_t k)
+ : fixupSectionOffset(fo), targetSectionOffset(to), fixupSectionIndex(fi), targetSectionIndex(ti), referenceKind(k) {}
+ uint64_t fixupSectionOffset;
+ uint64_t targetSectionOffset;
+ uint8_t fixupSectionIndex;
+ uint8_t targetSectionIndex;
+ uint8_t referenceKind;
+ };
+ static void dumpAtomsBySection(ld::Internal& state, bool);
+
private:
void writeAtoms(ld::Internal& state, uint8_t* wholeBuffer);
void computeContentUUID(ld::Internal& state, uint8_t* wholeBuffer);
void generateLinkEditInfo(ld::Internal& state);
void buildSymbolTable(ld::Internal& state);
void writeOutputFile(ld::Internal& state);
- void assignFileOffsets(ld::Internal& state);
- void setSectionSizesAndAlignments(ld::Internal& state);
void addSectionRelocs(ld::Internal& state, ld::Internal::FinalSection* sect,
const ld::Atom* atom, ld::Fixup* fixupWithTarget,
ld::Fixup* fixupWithMinusTarget, ld::Fixup* fixupWithAddend,
void updateLINKEDITAddresses(ld::Internal& state);
void applyFixUps(ld::Internal& state, uint64_t mhAddress, const ld::Atom* atom, uint8_t* buffer);
uint64_t addressOf(const ld::Internal& state, const ld::Fixup* fixup, const ld::Atom** target);
+ uint64_t addressAndTarget(const ld::Internal& state, const ld::Fixup* fixup, const ld::Atom** target);
bool targetIsThumb(ld::Internal& state, const ld::Fixup* fixup);
uint32_t lazyBindingInfoOffsetForLazyPointerAddress(uint64_t lpAddress);
void copyNoOps(uint8_t* from, uint8_t* to, bool thumb);
void makeSectionRelocations(ld::Internal& state);
void makeDyldInfo(ld::Internal& state);
void makeSplitSegInfo(ld::Internal& state);
+ void makeSplitSegInfoV2(ld::Internal& state);
void writeMapFile(ld::Internal& state);
+ void writeJSONEntry(ld::Internal& state);
uint64_t lookBackAddend(ld::Fixup::iterator fit);
bool takesNoDiskSpace(const ld::Section* sect);
bool hasZeroForFileOffset(const ld::Section* sect);
void printSectionLayout(ld::Internal& state);
+
+ bool checkThumbBranch22Displacement(int64_t displacement);
+ bool checkArmBranch24Displacement(int64_t displacement);
+
void rangeCheck8(int64_t delta, ld::Internal& state, const ld::Atom* atom,
const ld::Fixup* fixup);
void rangeCheck16(int64_t delta, ld::Internal& state, const ld::Atom* atom,
uint64_t sectionOffsetOf(const ld::Internal& state, const ld::Fixup* fixup);
uint64_t tlvTemplateOffsetOf(const ld::Internal& state, const ld::Fixup* fixup);
- void dumpAtomsBySection(ld::Internal& state, bool);
void synthesizeDebugNotes(ld::Internal& state);
const char* assureFullPath(const char* path);
void noteTextReloc(const ld::Atom* atom, const ld::Atom* target);
+ struct InstructionInfo {
+ uint32_t offsetInAtom;
+ const ld::Fixup* fixup;
+ const ld::Atom* target;
+ uint64_t targetAddress;
+ uint8_t* instructionContent;
+ uint64_t instructionAddress;
+ uint32_t instruction;
+ };
+
+ void setInfo(ld::Internal& state, const ld::Atom* atom, uint8_t* buffer, const std::map<uint32_t, const Fixup*>& usedHints,
+ uint32_t offsetInAtom, uint32_t delta, InstructionInfo* info);
+
static uint16_t get16LE(uint8_t* loc);
static void set16LE(uint8_t* loc, uint16_t value);
static uint32_t get32LE(uint8_t* loc);
const bool _hasSplitSegInfo;
const bool _hasFunctionStartsInfo;
const bool _hasDataInCodeInfo;
- const bool _hasDependentDRInfo;
bool _hasDynamicSymbolTable;
bool _hasLocalRelocations;
bool _hasExternalRelocations;
+ bool _hasOptimizationHints;
uint64_t _fileSize;
std::map<uint64_t, uint32_t> _lazyPointerAddressToInfoOffset;
uint32_t _encryptedTEXTstartOffset;
std::vector<BindingInfo> _lazyBindingInfo;
std::vector<BindingInfo> _weakBindingInfo;
std::vector<SplitSegInfoEntry> _splitSegInfos;
+ std::vector<SplitSegInfoV2Entry> _splitSegV2Infos;
class HeaderAndLoadCommandsAbtract* _headersAndLoadCommandAtom;
class RelocationsAtomAbstract* _sectionsRelocationsAtom;
class RelocationsAtomAbstract* _localRelocsAtom;
class LinkEditAtom* _splitSegInfoAtom;
class LinkEditAtom* _functionStartsAtom;
class LinkEditAtom* _dataInCodeAtom;
- class LinkEditAtom* _dependentDRInfoAtom;
+ class LinkEditAtom* _optimizationHintsAtom;
};
} // namespace tool