Home | History | Annotate | Download | only in LD
      1 //===- LDFileFormat.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_ELF_FILE_FORMAT_H
     10 #define MCLD_ELF_FILE_FORMAT_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 #include <mcld/LD/LDFileFormat.h>
     15 #include <mcld/LD/LDSection.h>
     16 
     17 namespace mcld
     18 {
     19 
     20 class GNULDBackend;
     21 class MCLinker;
     22 
     23 /** \class ELFFileFormat
     24  *  \brief ELFFileFormat describes the common file formats in ELF.
     25  *  LDFileFormats control the formats of the output file.
     26  *
     27  *  @ref "Object Files," Ch. 4, in System V Application Binary Interface,
     28  *  Fourth Edition.
     29  *
     30  *  @ref "Object Format," Ch. 10, in ISO/IEC 23360 Part 1:2010(E), Linux
     31  *  Standard Base Core Specification 4.1.
     32  */
     33 class ELFFileFormat : public LDFileFormat
     34 {
     35 public:
     36   ELFFileFormat(GNULDBackend& pBackend);
     37 
     38   virtual ~ELFFileFormat();
     39 
     40   virtual void initObjectFormat(MCLinker& pLinker);
     41 
     42   virtual void initObjectType(MCLinker& pLinker) = 0;
     43 
     44   // -----  capacity  ----- //
     45   /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition.
     46   bool hasNULLSection() const
     47   { return (NULL != f_pNULLSection) && (0 != f_pNULLSection->size()); }
     48 
     49   bool hasGOT() const
     50   { return (NULL != f_pGOT) && (0 != f_pGOT->size()); }
     51 
     52   bool hasPLT() const
     53   { return (NULL != f_pPLT) && (0 != f_pPLT->size()); }
     54 
     55   bool hasRelDyn() const
     56   { return (NULL != f_pRelDyn) && (0 != f_pRelDyn->size()); }
     57 
     58   bool hasRelPlt() const
     59   { return (NULL != f_pRelPlt) && (0 != f_pRelPlt->size()); }
     60 
     61   bool hasRelaDyn() const
     62   { return (NULL != f_pRelaDyn) && (0 != f_pRelaDyn->size()); }
     63 
     64   bool hasRelaPlt() const
     65   { return (NULL != f_pRelaPlt) && (0 != f_pRelaPlt->size()); }
     66 
     67   /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21.
     68   bool hasComment() const
     69   { return (NULL != f_pComment) && (0 != f_pComment->size()); }
     70 
     71   bool hasData1() const
     72   { return (NULL != f_pData1) && (0 != f_pData1->size()); }
     73 
     74   bool hasDebug() const
     75   { return (NULL != f_pDebug) && (0 != f_pDebug->size()); }
     76 
     77   bool hasDynamic() const
     78   { return (NULL != f_pDynamic) && (0 != f_pDynamic->size()); }
     79 
     80   bool hasDynStrTab() const
     81   { return (NULL != f_pDynStrTab) && (0 != f_pDynStrTab->size()); }
     82 
     83   bool hasDynSymTab() const
     84   { return (NULL != f_pDynSymTab) && (0 != f_pDynSymTab->size()); }
     85 
     86   bool hasFini() const
     87   { return (NULL != f_pFini) && (0 != f_pFini->size()); }
     88 
     89   bool hasFiniArray() const
     90   { return (NULL != f_pFiniArray) && (0 != f_pFiniArray->size()); }
     91 
     92   bool hasHashTab() const
     93   { return (NULL != f_pHashTab) && (0 != f_pHashTab->size()); }
     94 
     95   bool hasInit() const
     96   { return (NULL != f_pInit) && (0 != f_pInit->size()); }
     97 
     98   bool hasInitArray() const
     99   { return (NULL != f_pInitArray) && (0 != f_pInitArray->size()); }
    100 
    101   bool hasInterp() const
    102   { return (NULL != f_pInterp) && (0 != f_pInterp->size()); }
    103 
    104   bool hasLine() const
    105   { return (NULL != f_pLine) && (0 != f_pLine->size()); }
    106 
    107   bool hasNote() const
    108   { return (NULL != f_pNote) && (0 != f_pNote->size()); }
    109 
    110   bool hasPreInitArray() const
    111   { return (NULL != f_pPreInitArray) && (0 != f_pPreInitArray->size()); }
    112 
    113   bool hasROData1() const
    114   { return (NULL != f_pROData1) && (0 != f_pROData1->size()); }
    115 
    116   bool hasShStrTab() const
    117   { return (NULL != f_pShStrTab) && (0 != f_pShStrTab->size()); }
    118 
    119   bool hasStrTab() const
    120   { return (NULL != f_pStrTab) && (0 != f_pStrTab->size()); }
    121 
    122   bool hasSymTab() const
    123   { return (NULL != f_pSymTab) && (0 != f_pSymTab->size()); }
    124 
    125   bool hasTBSS() const
    126   { return (NULL != f_pTBSS) && (0 != f_pTBSS->size()); }
    127 
    128   bool hasTData() const
    129   { return (NULL != f_pTData) && (0 != f_pTData->size()); }
    130 
    131   /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24.
    132   bool hasCtors() const
    133   { return (NULL != f_pCtors) && (0 != f_pCtors->size()); }
    134 
    135   bool hasDataRelRo() const
    136   { return (NULL != f_pDataRelRo) && (0 != f_pDataRelRo->size()); }
    137 
    138   bool hasDtors() const
    139   { return (NULL != f_pDtors) && (0 != f_pDtors->size()); }
    140 
    141   bool hasEhFrame() const
    142   { return (NULL != f_pEhFrame) && (0 != f_pEhFrame->size()); }
    143 
    144   bool hasEhFrameHdr() const
    145   { return (NULL != f_pEhFrameHdr) && (0 != f_pEhFrameHdr->size()); }
    146 
    147   bool hasGCCExceptTable() const
    148   { return (NULL != f_pGCCExceptTable) && (0 != f_pGCCExceptTable->size()); }
    149 
    150   bool hasGNUVersion() const
    151   { return (NULL != f_pGNUVersion) && (0 != f_pGNUVersion->size()); }
    152 
    153   bool hasGNUVersionD() const
    154   { return (NULL != f_pGNUVersionD) && (0 != f_pGNUVersionD->size()); }
    155 
    156   bool hasGNUVersionR() const
    157   { return (NULL != f_pGNUVersionR) && (0 != f_pGNUVersionR->size()); }
    158 
    159   bool hasGOTPLT() const
    160   { return (NULL != f_pGOTPLT) && (0 != f_pGOTPLT->size()); }
    161 
    162   bool hasJCR() const
    163   { return (NULL != f_pJCR) && (0 != f_pJCR->size()); }
    164 
    165   bool hasNoteABITag() const
    166   { return (NULL != f_pNoteABITag) && (0 != f_pNoteABITag->size()); }
    167 
    168   bool hasStab() const
    169   { return (NULL != f_pStab) && (0 != f_pStab->size()); }
    170 
    171   bool hasStabStr() const
    172   { return (NULL != f_pStabStr) && (0 != f_pStabStr->size()); }
    173 
    174   // -----  access functions  ----- //
    175   /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition.
    176   LDSection& getNULLSection() {
    177     assert(NULL != f_pNULLSection);
    178     return *f_pNULLSection;
    179   }
    180 
    181   const LDSection& getNULLSection() const {
    182     assert(NULL != f_pNULLSection);
    183     return *f_pNULLSection;
    184   }
    185 
    186   LDSection& getGOT() {
    187     assert(NULL != f_pGOT);
    188     return *f_pGOT;
    189   }
    190 
    191   const LDSection& getGOT() const {
    192     assert(NULL != f_pGOT);
    193     return *f_pGOT;
    194   }
    195 
    196   LDSection& getPLT() {
    197     assert(NULL != f_pPLT);
    198     return *f_pPLT;
    199   }
    200 
    201   const LDSection& getPLT() const {
    202     assert(NULL != f_pPLT);
    203     return *f_pPLT;
    204   }
    205 
    206   LDSection& getRelDyn() {
    207     assert(NULL != f_pRelDyn);
    208     return *f_pRelDyn;
    209   }
    210 
    211   const LDSection& getRelDyn() const {
    212     assert(NULL != f_pRelDyn);
    213     return *f_pRelDyn;
    214   }
    215 
    216   LDSection& getRelPlt() {
    217     assert(NULL != f_pRelPlt);
    218     return *f_pRelPlt;
    219   }
    220 
    221   const LDSection& getRelPlt() const {
    222     assert(NULL != f_pRelPlt);
    223     return *f_pRelPlt;
    224   }
    225 
    226   LDSection& getRelaDyn() {
    227     assert(NULL != f_pRelaDyn);
    228     return *f_pRelaDyn;
    229   }
    230 
    231   const LDSection& getRelaDyn() const {
    232     assert(NULL != f_pRelaDyn);
    233     return *f_pRelaDyn;
    234   }
    235 
    236   LDSection& getRelaPlt() {
    237     assert(NULL != f_pRelaPlt);
    238     return *f_pRelaPlt;
    239   }
    240 
    241   const LDSection& getRelaPlt() const {
    242     assert(NULL != f_pRelaPlt);
    243     return *f_pRelaPlt;
    244   }
    245 
    246   LDSection& getComment() {
    247     assert(NULL != f_pComment);
    248     return *f_pComment;
    249   }
    250 
    251   /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21.
    252   const LDSection& getComment() const {
    253     assert(NULL != f_pComment);
    254     return *f_pComment;
    255   }
    256 
    257   LDSection& getData1() {
    258     assert(NULL != f_pData1);
    259     return *f_pData1;
    260   }
    261 
    262   const LDSection& getData1() const {
    263     assert(NULL != f_pData1);
    264     return *f_pData1;
    265   }
    266 
    267   LDSection& getDebug() {
    268     assert(NULL != f_pDebug);
    269     return *f_pDebug;
    270   }
    271 
    272   const LDSection& getDebug() const {
    273     assert(NULL != f_pDebug);
    274     return *f_pDebug;
    275   }
    276 
    277   LDSection& getDynamic() {
    278     assert(NULL != f_pDynamic);
    279     return *f_pDynamic;
    280   }
    281 
    282   const LDSection& getDynamic() const {
    283     assert(NULL != f_pDynamic);
    284     return *f_pDynamic;
    285   }
    286 
    287   LDSection& getDynStrTab() {
    288     assert(NULL != f_pDynStrTab);
    289     return *f_pDynStrTab;
    290   }
    291 
    292   const LDSection& getDynStrTab() const {
    293     assert(NULL != f_pDynStrTab);
    294     return *f_pDynStrTab;
    295   }
    296 
    297   LDSection& getDynSymTab() {
    298     assert(NULL != f_pDynSymTab);
    299     return *f_pDynSymTab;
    300   }
    301 
    302   const LDSection& getDynSymTab() const {
    303     assert(NULL != f_pDynSymTab);
    304     return *f_pDynSymTab;
    305   }
    306 
    307   LDSection& getFini() {
    308     assert(NULL != f_pFini);
    309     return *f_pFini;
    310   }
    311 
    312   const LDSection& getFini() const {
    313     assert(NULL != f_pFini);
    314     return *f_pFini;
    315   }
    316 
    317   LDSection& getFiniArray() {
    318     assert(NULL != f_pFiniArray);
    319     return *f_pFiniArray;
    320   }
    321 
    322   const LDSection& getFiniArray() const {
    323     assert(NULL != f_pFiniArray);
    324     return *f_pFiniArray;
    325   }
    326 
    327   LDSection& getHashTab() {
    328     assert(NULL != f_pHashTab);
    329     return *f_pHashTab;
    330   }
    331 
    332   const LDSection& getHashTab() const {
    333     assert(NULL != f_pHashTab);
    334     return *f_pHashTab;
    335   }
    336 
    337   LDSection& getInit() {
    338     assert(NULL != f_pInit);
    339     return *f_pInit;
    340   }
    341 
    342   const LDSection& getInit() const {
    343     assert(NULL != f_pInit);
    344     return *f_pInit;
    345   }
    346 
    347   LDSection& getInitArray() {
    348     assert(NULL != f_pInitArray);
    349     return *f_pInitArray;
    350   }
    351 
    352   const LDSection& getInitArray() const {
    353     assert(NULL != f_pInitArray);
    354     return *f_pInitArray;
    355   }
    356 
    357   LDSection& getInterp() {
    358     assert(NULL != f_pInterp);
    359     return *f_pInterp;
    360   }
    361 
    362   const LDSection& getInterp() const {
    363     assert(NULL != f_pInterp);
    364     return *f_pInterp;
    365   }
    366 
    367   LDSection& getLine() {
    368     assert(NULL != f_pLine);
    369     return *f_pLine;
    370   }
    371 
    372   const LDSection& getLine() const {
    373     assert(NULL != f_pLine);
    374     return *f_pLine;
    375   }
    376 
    377   LDSection& getNote() {
    378     assert(NULL != f_pNote);
    379     return *f_pNote;
    380   }
    381 
    382   const LDSection& getNote() const {
    383     assert(NULL != f_pNote);
    384     return *f_pNote;
    385   }
    386 
    387   LDSection& getPreInitArray() {
    388     assert(NULL != f_pPreInitArray);
    389     return *f_pPreInitArray;
    390   }
    391 
    392   const LDSection& getPreInitArray() const {
    393     assert(NULL != f_pPreInitArray);
    394     return *f_pPreInitArray;
    395   }
    396 
    397   LDSection& getROData1() {
    398     assert(NULL != f_pROData1);
    399     return *f_pROData1;
    400   }
    401 
    402   const LDSection& getROData1() const {
    403     assert(NULL != f_pROData1);
    404     return *f_pROData1;
    405   }
    406 
    407   LDSection& getShStrTab() {
    408     assert(NULL != f_pShStrTab);
    409     return *f_pShStrTab;
    410   }
    411 
    412   const LDSection& getShStrTab() const {
    413     assert(NULL != f_pShStrTab);
    414     return *f_pShStrTab;
    415   }
    416 
    417   LDSection& getStrTab() {
    418     assert(NULL != f_pStrTab);
    419     return *f_pStrTab;
    420   }
    421 
    422   const LDSection& getStrTab() const {
    423     assert(NULL != f_pStrTab);
    424     return *f_pStrTab;
    425   }
    426 
    427   LDSection& getSymTab() {
    428     assert(NULL != f_pSymTab);
    429     return *f_pSymTab;
    430   }
    431 
    432   const LDSection& getSymTab() const {
    433     assert(NULL != f_pSymTab);
    434     return *f_pSymTab;
    435   }
    436 
    437   LDSection& getTBSS() {
    438     assert(NULL != f_pTBSS);
    439     return *f_pTBSS;
    440   }
    441 
    442   const LDSection& getTBSS() const {
    443     assert(NULL != f_pTBSS);
    444     return *f_pTBSS;
    445   }
    446 
    447   LDSection& getTData() {
    448     assert(NULL != f_pTData);
    449     return *f_pTData;
    450   }
    451 
    452   const LDSection& getTData() const {
    453     assert(NULL != f_pTData);
    454     return *f_pTData;
    455   }
    456 
    457   /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24.
    458   LDSection& getCtors() {
    459     assert(NULL != f_pCtors);
    460     return *f_pCtors;
    461   }
    462 
    463   const LDSection& getCtors() const {
    464     assert(NULL != f_pCtors);
    465     return *f_pCtors;
    466   }
    467 
    468   LDSection& getDataRelRo() {
    469     assert(NULL != f_pDataRelRo);
    470     return *f_pDataRelRo;
    471   }
    472 
    473   const LDSection& getDataRelRo() const {
    474     assert(NULL != f_pDataRelRo);
    475     return *f_pDataRelRo;
    476   }
    477 
    478   LDSection& getDtors() {
    479     assert(NULL != f_pDtors);
    480     return *f_pDtors;
    481   }
    482 
    483   const LDSection& getDtors() const {
    484     assert(NULL != f_pDtors);
    485     return *f_pDtors;
    486   }
    487 
    488   LDSection& getEhFrame() {
    489     assert(NULL != f_pEhFrame);
    490     return *f_pEhFrame;
    491   }
    492 
    493   const LDSection& getEhFrame() const {
    494     assert(NULL != f_pEhFrame);
    495     return *f_pEhFrame;
    496   }
    497 
    498   LDSection& getEhFrameHdr() {
    499     assert(NULL != f_pEhFrameHdr);
    500     return *f_pEhFrameHdr;
    501   }
    502 
    503   const LDSection& getEhFrameHdr() const {
    504     assert(NULL != f_pEhFrameHdr);
    505     return *f_pEhFrameHdr;
    506   }
    507 
    508   LDSection& getGCCExceptTable() {
    509     assert(NULL != f_pGCCExceptTable);
    510     return *f_pGCCExceptTable;
    511   }
    512 
    513   const LDSection& getGCCExceptTable() const {
    514     assert(NULL != f_pGCCExceptTable);
    515     return *f_pGCCExceptTable;
    516   }
    517 
    518   LDSection& getGNUVersion() {
    519     assert(NULL != f_pGNUVersion);
    520     return *f_pGNUVersion;
    521   }
    522 
    523   const LDSection& getGNUVersion() const {
    524     assert(NULL != f_pGNUVersion);
    525     return *f_pGNUVersion;
    526   }
    527 
    528   LDSection& getGNUVersionD() {
    529     assert(NULL != f_pGNUVersionD);
    530     return *f_pGNUVersionD;
    531   }
    532 
    533   const LDSection& getGNUVersionD() const {
    534     assert(NULL != f_pGNUVersionD);
    535     return *f_pGNUVersionD;
    536   }
    537 
    538   LDSection& getGNUVersionR() {
    539     assert(NULL != f_pGNUVersionR);
    540     return *f_pGNUVersionR;
    541   }
    542 
    543   const LDSection& getGNUVersionR() const {
    544     assert(NULL != f_pGNUVersionR);
    545     return *f_pGNUVersionR;
    546   }
    547 
    548   LDSection& getGOTPLT() {
    549     assert(NULL != f_pGOTPLT);
    550     return *f_pGOTPLT;
    551   }
    552 
    553   const LDSection& getGOTPLT() const {
    554     assert(NULL != f_pGOTPLT);
    555     return *f_pGOTPLT;
    556   }
    557 
    558   LDSection& getJCR() {
    559     assert(NULL != f_pJCR);
    560     return *f_pJCR;
    561   }
    562 
    563   const LDSection& getJCR() const {
    564     assert(NULL != f_pJCR);
    565     return *f_pJCR;
    566   }
    567 
    568   LDSection& getNoteABITag() {
    569     assert(NULL != f_pNoteABITag);
    570     return *f_pNoteABITag;
    571   }
    572 
    573   const LDSection& getNoteABITag() const {
    574     assert(NULL != f_pNoteABITag);
    575     return *f_pNoteABITag;
    576   }
    577 
    578   LDSection& getStab() {
    579     assert(NULL != f_pStab);
    580     return *f_pStab;
    581   }
    582 
    583   const LDSection& getStab() const {
    584     assert(NULL != f_pStab);
    585     return *f_pStab;
    586   }
    587 
    588   LDSection& getStabStr() {
    589     assert(NULL != f_pStabStr);
    590     return *f_pStabStr;
    591   }
    592 
    593   const LDSection& getStabStr() const {
    594     assert(NULL != f_pStabStr);
    595     return *f_pStabStr;
    596   }
    597 
    598 protected:
    599   GNULDBackend& f_Backend;
    600 
    601   //         variable name         :  ELF
    602   /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition.
    603   LDSection* f_pNULLSection;
    604   LDSection* f_pGOT;               // .got
    605   LDSection* f_pPLT;               // .plt
    606   LDSection* f_pRelDyn;            // .rel.dyn
    607   LDSection* f_pRelPlt;            // .rel.plt
    608   LDSection* f_pRelaDyn;           // .rela.dyn
    609   LDSection* f_pRelaPlt;           // .rela.plt
    610 
    611   /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21.
    612   LDSection* f_pComment;           // .comment
    613   LDSection* f_pData1;             // .data1
    614   LDSection* f_pDebug;             // .debug
    615   LDSection* f_pDynamic;           // .dynamic
    616   LDSection* f_pDynStrTab;         // .dynstr
    617   LDSection* f_pDynSymTab;         // .dynsym
    618   LDSection* f_pFini;              // .fini
    619   LDSection* f_pFiniArray;         // .fini_array
    620   LDSection* f_pHashTab;           // .hash
    621   LDSection* f_pInit;              // .init
    622   LDSection* f_pInitArray;         // .init_array
    623   LDSection* f_pInterp;            // .interp
    624   LDSection* f_pLine;              // .line
    625   LDSection* f_pNote;              // .note
    626   LDSection* f_pPreInitArray;      // .preinit_array
    627   LDSection* f_pROData1;           // .rodata1
    628   LDSection* f_pShStrTab;          // .shstrtab
    629   LDSection* f_pStrTab;            // .strtab
    630   LDSection* f_pSymTab;            // .symtab
    631   LDSection* f_pTBSS;              // .tbss
    632   LDSection* f_pTData;             // .tdata
    633 
    634   /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24.
    635   LDSection* f_pCtors;             // .ctors
    636   LDSection* f_pDataRelRo;         // .data.rel.ro
    637   LDSection* f_pDtors;             // .dtors
    638   LDSection* f_pEhFrame;           // .eh_frame
    639   LDSection* f_pEhFrameHdr;        // .eh_frame_hdr
    640   LDSection* f_pGCCExceptTable;    // .gcc_except_table
    641   LDSection* f_pGNUVersion;        // .gnu.version
    642   LDSection* f_pGNUVersionD;       // .gnu.version_d
    643   LDSection* f_pGNUVersionR;       // .gnu.version_r
    644   LDSection* f_pGOTPLT;            // .got.plt
    645   LDSection* f_pJCR;               // .jcr
    646   LDSection* f_pNoteABITag;        // .note.ABI-tag
    647   LDSection* f_pStab;              // .stab
    648   LDSection* f_pStabStr;           // .stabstr
    649 };
    650 
    651 } // namespace of mcld
    652 
    653 #endif
    654