Home | History | Annotate | Download | only in Target
      1 //===- GNULDBackend.h -----------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_TARGET_GNU_LDBACKEND_H
     10 #define MCLD_TARGET_GNU_LDBACKEND_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 #include <mcld/Target/TargetLDBackend.h>
     15 
     16 #include <llvm/Support/ELF.h>
     17 #include <mcld/ADT/HashTable.h>
     18 #include <mcld/ADT/HashEntry.h>
     19 #include <mcld/LD/ELFDynObjFileFormat.h>
     20 #include <mcld/LD/ELFExecFileFormat.h>
     21 #include <mcld/LD/ELFObjectFileFormat.h>
     22 #include <mcld/LD/GNUArchiveReader.h>
     23 #include <mcld/LD/ELFObjectReader.h>
     24 #include <mcld/LD/ELFDynObjReader.h>
     25 #include <mcld/LD/ELFBinaryReader.h>
     26 #include <mcld/LD/ELFObjectWriter.h>
     27 #include <mcld/LD/ELFSegment.h>
     28 #include <mcld/LD/ELFSegmentFactory.h>
     29 #include <mcld/Target/ELFDynamic.h>
     30 #include <mcld/Target/GNUInfo.h>
     31 
     32 #include <mcld/Support/GCFactory.h>
     33 #include <mcld/Module.h>
     34 
     35 namespace mcld {
     36 
     37 class Module;
     38 class LinkerConfig;
     39 class IRBuilder;
     40 class Layout;
     41 class EhFrameHdr;
     42 class BranchIslandFactory;
     43 class StubFactory;
     44 class GNUInfo;
     45 
     46 /** \class GNULDBackend
     47  *  \brief GNULDBackend provides a common interface for all GNU Unix-OS
     48  *  LDBackend.
     49  */
     50 class GNULDBackend : public TargetLDBackend
     51 {
     52 protected:
     53   GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
     54 
     55 public:
     56   virtual ~GNULDBackend();
     57 
     58   // -----  readers/writers  ----- //
     59   GNUArchiveReader* createArchiveReader(Module& pModule);
     60   ELFObjectReader* createObjectReader(IRBuilder& pBuilder);
     61   ELFDynObjReader* createDynObjReader(IRBuilder& pBuilder);
     62   ELFBinaryReader* createBinaryReader(IRBuilder& pBuilder);
     63   ELFObjectWriter* createWriter();
     64 
     65   // -----  output sections  ----- //
     66   /// initStdSections - initialize standard sections of the output file.
     67   bool initStdSections(ObjectBuilder& pBuilder);
     68 
     69   /// getOutputFormat - get the sections of the output file.
     70   const ELFFileFormat* getOutputFormat() const;
     71   ELFFileFormat*       getOutputFormat();
     72 
     73   // -----  target symbols ----- //
     74   /// initStandardSymbols - initialize standard symbols.
     75   /// Some section symbols is undefined in input object, and linkers must set
     76   /// up its value. Take __init_array_begin for example. This symbol is an
     77   /// undefined symbol in input objects. ObjectLinker must finalize its value
     78   /// to the begin of the .init_array section, then relocation enties to
     79   /// __init_array_begin can be applied without emission of "undefined
     80   /// reference to `__init_array_begin'".
     81   bool initStandardSymbols(IRBuilder& pBuilder, Module& pModule);
     82 
     83   /// finalizeSymbol - Linker checks pSymbol.reserved() if it's not zero,
     84   /// then it will ask backend to finalize the symbol value.
     85   /// @return ture - if backend set the symbol value sucessfully
     86   /// @return false - if backend do not recognize the symbol
     87   bool finalizeSymbols() {
     88     return (finalizeStandardSymbols() &&
     89             finalizeTargetSymbols());
     90   }
     91 
     92   /// finalizeStandardSymbols - set the value of standard symbols
     93   virtual bool finalizeStandardSymbols();
     94 
     95   /// finalizeTargetSymbols - set the value of target symbols
     96   virtual bool finalizeTargetSymbols() = 0;
     97 
     98   /// finalizeTLSSymbol - set the value of a TLS symbol
     99   virtual bool finalizeTLSSymbol(LDSymbol& pSymbol);
    100 
    101   size_t sectionStartOffset() const;
    102 
    103   const GNUInfo& getInfo() const { return *m_pInfo; }
    104   GNUInfo&       getInfo()       { return *m_pInfo; }
    105 
    106   bool hasTextRel() const { return m_bHasTextRel; }
    107 
    108   bool hasStaticTLS() const { return m_bHasStaticTLS; }
    109 
    110   /// getSegmentStartAddr - this function returns the start address of the segment
    111   uint64_t getSegmentStartAddr(const LinkerScript& pScript) const;
    112 
    113   /// sizeNamePools - compute the size of regular name pools
    114   /// In ELF executable files, regular name pools are .symtab, .strtab.,
    115   /// .dynsym, .dynstr, and .hash
    116   virtual void sizeNamePools(Module& pModule);
    117 
    118   /// emitSectionData - emit target-dependent section data
    119   virtual uint64_t emitSectionData(const LDSection& pSection,
    120                                    MemoryRegion& pRegion) const = 0;
    121 
    122   /// emitRegNamePools - emit regular name pools - .symtab, .strtab
    123   virtual void emitRegNamePools(const Module& pModule, MemoryArea& pOutput);
    124 
    125   /// emitNamePools - emit dynamic name pools - .dyntab, .dynstr, .hash
    126   virtual void emitDynNamePools(Module& pModule, MemoryArea& pOutput);
    127 
    128   /// emitELFHashTab - emit .hash
    129   virtual void emitELFHashTab(const Module::SymbolTable& pSymtab,
    130                               MemoryArea& pOutput);
    131 
    132   /// emitGNUHashTab - emit .gnu.hash
    133   virtual void emitGNUHashTab(Module::SymbolTable& pSymtab,
    134                               MemoryArea& pOutput);
    135 
    136   /// sizeInterp - compute the size of program interpreter's name
    137   /// In ELF executables, this is the length of dynamic linker's path name
    138   virtual void sizeInterp();
    139 
    140   /// emitInterp - emit the .interp
    141   virtual void emitInterp(MemoryArea& pOutput);
    142 
    143   /// hasEntryInStrTab - symbol has an entry in a .strtab
    144   virtual bool hasEntryInStrTab(const LDSymbol& pSym) const;
    145 
    146   /// orderSymbolTable - order symbol table before emitting
    147   virtual void orderSymbolTable(Module& pModule);
    148 
    149   void setHasStaticTLS(bool pVal = true)
    150   { m_bHasStaticTLS = pVal; }
    151 
    152   /// getSectionOrder - compute the layout order of the section
    153   /// Layout calls this function to get the default order of the pSectHdr.
    154   /// If the pSectHdr.type() is LDFileFormat::Target, then getSectionOrder()
    155   /// will call getTargetSectionOrder().
    156   ///
    157   /// If targets favors certain order for general sections, please override
    158   /// this function.
    159   ///
    160   /// @see getTargetSectionOrder
    161   virtual unsigned int getSectionOrder(const LDSection& pSectHdr) const;
    162 
    163   /// getTargetSectionOrder - compute the layout order of target section
    164   /// If the target favors certain order for the given gSectHdr, please
    165   /// override this function.
    166   ///
    167   /// By default, this function returns the maximun order, and pSectHdr
    168   /// will be the last section to be laid out.
    169   virtual unsigned int getTargetSectionOrder(const LDSection& pSectHdr) const
    170   { return (unsigned int)-1; }
    171 
    172   /// numOfSegments - return the number of segments
    173   /// if the target favors other ways to emit program header, please override
    174   /// this function
    175   size_t numOfSegments() const { return m_ELFSegmentTable.size(); }
    176 
    177   /// elfSegmentTable - return the reference of the elf segment table
    178   ELFSegmentFactory&       elfSegmentTable()       { return m_ELFSegmentTable; }
    179 
    180   /// elfSegmentTable - return the reference of the elf segment table
    181   const ELFSegmentFactory& elfSegmentTable() const { return m_ELFSegmentTable; }
    182 
    183   /// commonPageSize - the common page size of the target machine
    184   uint64_t commonPageSize() const;
    185 
    186   /// abiPageSize - the abi page size of the target machine
    187   uint64_t abiPageSize() const;
    188 
    189   /// getSymbolIdx - get the symbol index of ouput symbol table
    190   size_t getSymbolIdx(const LDSymbol* pSymbol) const;
    191 
    192   /// allocateCommonSymbols - allocate common symbols in the corresponding
    193   /// sections.
    194   /// Different concrete target backend may overlap this function.
    195   virtual bool allocateCommonSymbols(Module& pModule);
    196 
    197   /// updateSectionFlags - update pTo's flags when merging pFrom
    198   /// update the output section flags based on input section flags.
    199   virtual bool updateSectionFlags(LDSection& pTo, const LDSection& pFrom);
    200 
    201   /// symbolNeedsPLT - return whether the symbol needs a PLT entry
    202   /// @ref Google gold linker, symtab.h:596
    203   bool symbolNeedsPLT(const ResolveInfo& pSym) const;
    204 
    205   /// symbolNeedsCopyReloc - return whether the symbol needs a copy relocation
    206   bool symbolNeedsCopyReloc(const Relocation& pReloc,
    207                             const ResolveInfo& pSym) const;
    208 
    209   /// symbolNeedsDynRel - return whether the symbol needs a dynamic relocation
    210   /// @ref Google gold linker, symtab.h:645
    211   bool symbolNeedsDynRel(const ResolveInfo& pSym,
    212                          bool pSymHasPLT,
    213                          bool isAbsReloc) const;
    214 
    215   /// isSymbolPreemtible - whether the symbol can be preemted by other
    216   /// link unit
    217   /// @ref Google gold linker, symtab.h:551
    218   bool isSymbolPreemptible(const ResolveInfo& pSym) const;
    219 
    220   /// symbolHasFinalValue - return true if the symbol's value can be decided at
    221   /// link time
    222   bool symbolFinalValueIsKnown(const ResolveInfo& pSym) const;
    223 
    224   /// isDynamicSymbol
    225   /// @ref Google gold linker: symtab.cc:311
    226   bool isDynamicSymbol(const LDSymbol& pSymbol);
    227 
    228   /// isDynamicSymbol
    229   /// @ref Google gold linker: symtab.cc:311
    230   bool isDynamicSymbol(const ResolveInfo& pResolveInfo);
    231 
    232   virtual ResolveInfo::Desc getSymDesc(uint16_t pShndx) const {
    233     return ResolveInfo::Define;
    234   }
    235 
    236   bool hasTDATASymbol() const { return (NULL != f_pTDATA); }
    237   bool hasTBSSSymbol()  const { return (NULL != f_pTBSS);  }
    238 
    239   void setTDATASymbol(LDSymbol& pTDATA) { f_pTDATA = &pTDATA; }
    240   void setTBSSSymbol(LDSymbol& pTBSS)   { f_pTBSS  = &pTBSS;  }
    241 
    242   // getTDATASymbol - get section symbol of .tdata
    243   LDSymbol& getTDATASymbol();
    244   const LDSymbol& getTDATASymbol() const;
    245 
    246   /// getTBSSSymbol - get section symbol of .tbss
    247   LDSymbol& getTBSSSymbol();
    248   const LDSymbol& getTBSSSymbol() const;
    249 
    250   //  -----  relaxation  -----  //
    251   /// initBRIslandFactory - initialize the branch island factory for relaxation
    252   bool initBRIslandFactory();
    253 
    254   /// initStubFactory - initialize the stub factory for relaxation
    255   bool initStubFactory();
    256 
    257   /// getBRIslandFactory
    258   BranchIslandFactory* getBRIslandFactory() { return m_pBRIslandFactory; }
    259 
    260   /// getStubFactory
    261   StubFactory*         getStubFactory()     { return m_pStubFactory; }
    262 
    263   /// maxBranchOffset - return the max (forward) branch offset of the backend.
    264   /// Target can override this function if needed.
    265   virtual uint64_t maxBranchOffset() { return (uint64_t)-1; }
    266 
    267   /// checkAndSetHasTextRel - check pSection flag to set HasTextRel
    268   void checkAndSetHasTextRel(const LDSection& pSection);
    269 
    270 protected:
    271   uint64_t getSymbolSize(const LDSymbol& pSymbol) const;
    272 
    273   uint64_t getSymbolInfo(const LDSymbol& pSymbol) const;
    274 
    275   uint64_t getSymbolValue(const LDSymbol& pSymbol) const;
    276 
    277   uint64_t getSymbolShndx(const LDSymbol& pSymbol) const;
    278 
    279   /// isTemporary - Whether pSymbol is a local label.
    280   virtual bool isTemporary(const LDSymbol& pSymbol) const;
    281 
    282   /// getHashBucketCount - calculate hash bucket count.
    283   /// @ref Google gold linker, dynobj.cc:791
    284   static unsigned getHashBucketCount(unsigned pNumOfSymbols, bool pIsGNUStyle);
    285 
    286   /// getGNUHashMaskbitslog2 - calculate the number of mask bits in log2
    287   /// @ref binutils gold, dynobj.cc:1165
    288   unsigned getGNUHashMaskbitslog2(unsigned pNumOfSymbols) const;
    289 
    290   /// emitSymbol32 - emit an ELF32 symbol
    291   void emitSymbol32(llvm::ELF::Elf32_Sym& pSym32,
    292                     LDSymbol& pSymbol,
    293                     char* pStrtab,
    294                     size_t pStrtabsize,
    295                     size_t pSymtabIdx);
    296 
    297   /// emitSymbol64 - emit an ELF64 symbol
    298   void emitSymbol64(llvm::ELF::Elf64_Sym& pSym64,
    299                     LDSymbol& pSymbol,
    300                     char* pStrtab,
    301                     size_t pStrtabsize,
    302                     size_t pSymtabIdx);
    303 
    304 private:
    305   /// createProgramHdrs - base on output sections to create the program headers
    306   void createProgramHdrs(Module& pModule);
    307 
    308   /// doCreateProgramHdrs - backend can implement this function to create the
    309   /// target-dependent segments
    310   virtual void doCreateProgramHdrs(Module& pModule) = 0;
    311 
    312   /// setupProgramHdrs - set up the attributes of segments
    313   ///  (i.e., offset, addresses, file/mem size, flag,  and alignment)
    314   void setupProgramHdrs(const LinkerScript& pScript);
    315 
    316   /// getSegmentFlag - give a section flag and return the corresponding segment
    317   /// flag
    318   inline uint32_t getSegmentFlag(const uint32_t pSectionFlag)
    319   {
    320     uint32_t flag = llvm::ELF::PF_R;
    321     if (0 != (pSectionFlag & llvm::ELF::SHF_WRITE))
    322       flag |= llvm::ELF::PF_W;
    323     if (0 != (pSectionFlag & llvm::ELF::SHF_EXECINSTR))
    324       flag |= llvm::ELF::PF_X;
    325     return flag;
    326   }
    327 
    328   /// setupGNUStackInfo - setup the section flag of .note.GNU-stack in output
    329   void setupGNUStackInfo(Module& pModule);
    330 
    331   /// setupRelro - setup the offset constraint of PT_RELRO
    332   void setupRelro(Module& pModule);
    333 
    334   /// setOutputSectionOffset - helper function to set a group of output sections'
    335   /// offset, and set pSectBegin to pStartOffset if pStartOffset is not -1U.
    336   void setOutputSectionOffset(Module& pModule,
    337                               Module::iterator pSectBegin,
    338                               Module::iterator pSectEnd,
    339                               uint64_t pStartOffset = -1U);
    340 
    341   /// setOutputSectionOffset - helper function to set output sections' address.
    342   void setOutputSectionAddress(Module& pModule,
    343                                Module::iterator pSectBegin,
    344                                Module::iterator pSectEnd);
    345 
    346   /// layout - layout method
    347   void layout(Module& pModule);
    348 
    349   /// preLayout - Backend can do any needed modification before layout
    350   void preLayout(Module& pModule, IRBuilder& pBuilder);
    351 
    352   /// postLayout -Backend can do any needed modification after layout
    353   void postLayout(Module& pModule, IRBuilder& pBuilder);
    354 
    355   /// preLayout - Backend can do any needed modification before layout
    356   virtual void doPreLayout(IRBuilder& pBuilder) = 0;
    357 
    358   /// postLayout -Backend can do any needed modification after layout
    359   virtual void doPostLayout(Module& pModule, IRBuilder& pLinker) = 0;
    360 
    361   /// postProcessing - Backend can do any needed modification in the final stage
    362   void postProcessing(MemoryArea& pOutput);
    363 
    364   /// dynamic - the dynamic section of the target machine.
    365   virtual ELFDynamic& dynamic() = 0;
    366 
    367   /// dynamic - the dynamic section of the target machine.
    368   virtual const ELFDynamic& dynamic() const = 0;
    369 
    370   /// relax - the relaxation pass
    371   bool relax(Module& pModule, IRBuilder& pBuilder);
    372 
    373   /// mayRelax - Backends should override this function if they need relaxation
    374   virtual bool mayRelax() { return false; }
    375 
    376   /// doRelax - Backend can orevride this function to add its relaxation
    377   /// implementation. Return true if the output (e.g., .text) is "relaxed"
    378   /// (i.e. layout is changed), and set pFinished to true if everything is fit,
    379   /// otherwise set it to false.
    380   virtual bool doRelax(Module& pModule, IRBuilder& pBuilder, bool& pFinished)
    381   { return false; }
    382 
    383   /// getRelEntrySize - the size in BYTE of rel type relocation
    384   virtual size_t getRelEntrySize() = 0;
    385 
    386   /// getRelEntrySize - the size in BYTE of rela type relocation
    387   virtual size_t getRelaEntrySize() = 0;
    388 
    389 protected:
    390   // Based on Kind in LDFileFormat to define basic section orders for ELF, and
    391   // refer gold linker to add more enumerations to handle Regular and BSS kind
    392   enum SectionOrder {
    393     SHO_INTERP = 1,          // .interp
    394     SHO_RO_NOTE,             // .note.ABI-tag, .note.gnu.build-id
    395     SHO_NAMEPOOL,            // *.hash, .dynsym, .dynstr
    396     SHO_RELOCATION,          // .rel.*, .rela.*
    397     SHO_REL_PLT,             // .rel.plt should come after other .rel.*
    398     SHO_INIT,                // .init
    399     SHO_PLT,                 // .plt
    400     SHO_TEXT,                // .text
    401     SHO_FINI,                // .fini
    402     SHO_RO,                  // .rodata
    403     SHO_EXCEPTION,           // .eh_frame_hdr, .eh_frame, .gcc_except_table
    404     SHO_TLS_DATA,            // .tdata
    405     SHO_TLS_BSS,             // .tbss
    406     SHO_RELRO_LOCAL,         // .data.rel.ro.local
    407     SHO_RELRO,               // .data.rel.ro,
    408     SHO_RELRO_LAST,          // for x86 to adjust .got if needed
    409     SHO_NON_RELRO_FIRST,     // for x86 to adjust .got.plt if needed
    410     SHO_DATA,                // .data
    411     SHO_LARGE_DATA,          // .ldata
    412     SHO_RW_NOTE,             //
    413     SHO_SMALL_DATA,          // .sdata
    414     SHO_SMALL_BSS,           // .sbss
    415     SHO_BSS,                 // .bss
    416     SHO_LARGE_BSS,           // .lbss
    417     SHO_UNDEFINED,           // default order
    418     SHO_STRTAB               // .strtab
    419   };
    420 
    421   typedef std::pair<LDSection*, unsigned int> SHOEntry;
    422 
    423   struct SHOCompare
    424   {
    425     bool operator()(const SHOEntry& X, const SHOEntry& Y) const
    426     { return X.second < Y.second; }
    427   };
    428 
    429   struct SymCompare
    430   {
    431     bool operator()(const LDSymbol* X, const LDSymbol* Y) const
    432     { return (X==Y); }
    433   };
    434 
    435   // for gnu style hash table
    436   struct DynsymCompare
    437   {
    438     bool needGNUHash(const LDSymbol& X) const;
    439 
    440     bool operator()(const LDSymbol* X, const LDSymbol* Y) const;
    441   };
    442 
    443   struct SymPtrHash
    444   {
    445     size_t operator()(const LDSymbol* pKey) const
    446     {
    447       return (unsigned((uintptr_t)pKey) >> 4) ^
    448              (unsigned((uintptr_t)pKey) >> 9);
    449     }
    450   };
    451 
    452   typedef HashEntry<LDSymbol*, size_t, SymCompare> SymHashEntryType;
    453   typedef HashTable<SymHashEntryType,
    454                     SymPtrHash,
    455                     EntryFactory<SymHashEntryType> > HashTableType;
    456 
    457 
    458 protected:
    459   ELFObjectReader* m_pObjectReader;
    460 
    461   // -----  file formats  ----- //
    462   ELFDynObjFileFormat* m_pDynObjFileFormat;
    463   ELFExecFileFormat*   m_pExecFileFormat;
    464   ELFObjectFileFormat* m_pObjectFileFormat;
    465 
    466   // GNUInfo
    467   GNUInfo* m_pInfo;
    468 
    469   // ELF segment factory
    470   ELFSegmentFactory m_ELFSegmentTable;
    471 
    472   // branch island factory
    473   BranchIslandFactory* m_pBRIslandFactory;
    474 
    475   // stub factory
    476   StubFactory* m_pStubFactory;
    477 
    478   // map the LDSymbol to its index in the output symbol table
    479   HashTableType* m_pSymIndexMap;
    480 
    481   // section .eh_frame_hdr
    482   EhFrameHdr* m_pEhFrameHdr;
    483 
    484   // ----- dynamic flags ----- //
    485   // DF_TEXTREL of DT_FLAGS
    486   bool m_bHasTextRel;
    487 
    488   // DF_STATIC_TLS of DT_FLAGS
    489   bool m_bHasStaticTLS;
    490 
    491   // -----  standard symbols  ----- //
    492   // section symbols
    493   LDSymbol* f_pPreInitArrayStart;
    494   LDSymbol* f_pPreInitArrayEnd;
    495   LDSymbol* f_pInitArrayStart;
    496   LDSymbol* f_pInitArrayEnd;
    497   LDSymbol* f_pFiniArrayStart;
    498   LDSymbol* f_pFiniArrayEnd;
    499   LDSymbol* f_pStack;
    500   LDSymbol* f_pDynamic;
    501 
    502   // section symbols for .tdata and .tbss
    503   LDSymbol* f_pTDATA;
    504   LDSymbol* f_pTBSS;
    505 
    506   // segment symbols
    507   LDSymbol* f_pExecutableStart;
    508   LDSymbol* f_pEText;
    509   LDSymbol* f_p_EText;
    510   LDSymbol* f_p__EText;
    511   LDSymbol* f_pEData;
    512   LDSymbol* f_p_EData;
    513   LDSymbol* f_pBSSStart;
    514   LDSymbol* f_pEnd;
    515   LDSymbol* f_p_End;
    516 };
    517 
    518 } // namespace of mcld
    519 
    520 #endif
    521 
    522