]> git.saurik.com Git - apple/ld64.git/blobdiff - src/ld/OutputFile.h
ld64-278.4.tar.gz
[apple/ld64.git] / src / ld / OutputFile.h
index bfc89367717d2713b2ce81b0626c1fdafa5fd48e..81f2cfb842e2691ca669202907e456dca7f3de0c 100644 (file)
@@ -68,11 +68,9 @@ public:
        uint64_t                                        fileSize() const { return _fileSize; }
        
        
-       bool                                            hasWeakExternalSymbols;
        bool                                            usesWeakExternalSymbols;
        bool                                            overridesWeakExternalSymbols;
        bool                                            _noReExportedDylibs;
-       bool                                            hasThreadLocalVariableDefinitions;
        bool                                            pieDisabled;
        bool                                            hasDataInCode;
        ld::Internal::FinalSection*     headerAndLoadCommandsSection;
@@ -84,7 +82,7 @@ public:
        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;
@@ -133,12 +131,24 @@ public:
        };
        
        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);
@@ -150,8 +160,6 @@ private:
        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,
@@ -181,6 +189,7 @@ private:
        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);
@@ -195,12 +204,18 @@ private:
        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, 
@@ -225,12 +240,24 @@ private:
                                                                                                                                                                                        
        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);
@@ -257,10 +284,10 @@ private:
        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;
@@ -281,6 +308,7 @@ public:
        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;
@@ -296,7 +324,7 @@ public:
        class LinkEditAtom*                                             _splitSegInfoAtom;
        class LinkEditAtom*                                             _functionStartsAtom;
        class LinkEditAtom*                                             _dataInCodeAtom;
-       class LinkEditAtom*                                             _dependentDRInfoAtom;
+       class LinkEditAtom*                                             _optimizationHintsAtom;
 };
 
 } // namespace tool