Home | History | Annotate | Download | only in Core
      1 //===- Linker.cpp ---------------------------------------------------------===//
      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 #include <mcld/Linker.h>
     10 #include <mcld/LinkerConfig.h>
     11 #include <mcld/Module.h>
     12 #include <mcld/IRBuilder.h>
     13 
     14 #include <mcld/Support/MsgHandling.h>
     15 #include <mcld/Support/TargetRegistry.h>
     16 #include <mcld/Support/FileHandle.h>
     17 #include <mcld/Support/MemoryArea.h>
     18 #include <mcld/Support/raw_ostream.h>
     19 
     20 #include <mcld/Object/ObjectLinker.h>
     21 #include <mcld/MC/InputBuilder.h>
     22 #include <mcld/Target/TargetLDBackend.h>
     23 #include <mcld/LD/LDSection.h>
     24 #include <mcld/LD/LDSymbol.h>
     25 #include <mcld/LD/SectionData.h>
     26 #include <mcld/LD/RelocData.h>
     27 #include <mcld/Fragment/Relocation.h>
     28 #include <mcld/Fragment/FragmentRef.h>
     29 
     30 #include <cassert>
     31 
     32 using namespace mcld;
     33 
     34 Linker::Linker()
     35   : m_pConfig(NULL), m_pIRBuilder(NULL),
     36     m_pTarget(NULL), m_pBackend(NULL), m_pObjLinker(NULL) {
     37 }
     38 
     39 Linker::~Linker()
     40 {
     41   reset();
     42 }
     43 
     44 /// emulate - To set up target-dependent options and default linker script.
     45 /// Follow GNU ld quirks.
     46 bool Linker::emulate(LinkerScript& pScript, LinkerConfig& pConfig)
     47 {
     48   m_pConfig = &pConfig;
     49 
     50   if (!initTarget())
     51     return false;
     52 
     53   if (!initBackend())
     54     return false;
     55 
     56   if (!initOStream())
     57     return false;
     58 
     59   if (!initEmulator(pScript))
     60     return false;
     61 
     62   return true;
     63 }
     64 
     65 bool Linker::link(Module& pModule, IRBuilder& pBuilder)
     66 {
     67   if (!normalize(pModule, pBuilder))
     68     return false;
     69 
     70   if (!resolve())
     71     return false;
     72 
     73   return layout();
     74 }
     75 
     76 /// normalize - to convert the command line language to the input tree.
     77 bool Linker::normalize(Module& pModule, IRBuilder& pBuilder)
     78 {
     79   assert(NULL != m_pConfig);
     80 
     81   m_pIRBuilder = &pBuilder;
     82 
     83   m_pObjLinker = new ObjectLinker(*m_pConfig, *m_pBackend);
     84 
     85   m_pObjLinker->setup(pModule, pBuilder);
     86 
     87   // 2. - initialize FragmentLinker
     88   if (!m_pObjLinker->initFragmentLinker())
     89     return false;
     90 
     91   // 3. - initialize output's standard sections
     92   if (!m_pObjLinker->initStdSections())
     93     return false;
     94 
     95   if (!Diagnose())
     96     return false;
     97 
     98   // 4. - normalize the input tree
     99   //   read out sections and symbol/string tables (from the files) and
    100   //   set them in Module. When reading out the symbol, resolve their symbols
    101   //   immediately and set their ResolveInfo (i.e., Symbol Resolution).
    102   m_pObjLinker->normalize();
    103 
    104   if (m_pConfig->options().trace()) {
    105     static int counter = 0;
    106     mcld::outs() << "** name\ttype\tpath\tsize (" << pModule.getInputTree().size() << ")\n";
    107     InputTree::const_dfs_iterator input, inEnd = pModule.getInputTree().dfs_end();
    108     for (input=pModule.getInputTree().dfs_begin(); input!=inEnd; ++input) {
    109       mcld::outs() << counter++ << " *  " << (*input)->name();
    110       switch((*input)->type()) {
    111       case Input::Archive:
    112         mcld::outs() << "\tarchive\t(";
    113         break;
    114       case Input::Object:
    115         mcld::outs() << "\tobject\t(";
    116         break;
    117       case Input::DynObj:
    118         mcld::outs() << "\tshared\t(";
    119         break;
    120       case Input::Script:
    121         mcld::outs() << "\tscript\t(";
    122         break;
    123       case Input::External:
    124         mcld::outs() << "\textern\t(";
    125         break;
    126       default:
    127         unreachable(diag::err_cannot_trace_file) << (*input)->type()
    128                                                  << (*input)->name()
    129                                                  << (*input)->path();
    130       }
    131       mcld::outs() << (*input)->path() << ")\n";
    132     }
    133   }
    134 
    135   // 5. - set up code position
    136   if (LinkerConfig::DynObj == m_pConfig->codeGenType() ||
    137       m_pConfig->options().isPIE()) {
    138     m_pConfig->setCodePosition(LinkerConfig::Independent);
    139   }
    140   else if (pModule.getLibraryList().empty()) {
    141     // If the output is dependent on its loaded address, and it does not need
    142     // to call outside functions, then we can treat the output static dependent
    143     // and perform better optimizations.
    144     m_pConfig->setCodePosition(LinkerConfig::StaticDependent);
    145 
    146     if (LinkerConfig::Exec == m_pConfig->codeGenType()) {
    147       // Since the output is static dependent, there should not have any undefined
    148       // references in the output module.
    149       m_pConfig->options().setNoUndefined();
    150     }
    151   }
    152   else {
    153     m_pConfig->setCodePosition(LinkerConfig::DynamicDependent);
    154   }
    155 
    156   if (!m_pObjLinker->linkable())
    157     return Diagnose();
    158 
    159   return true;
    160 }
    161 
    162 bool Linker::resolve()
    163 {
    164   assert(NULL != m_pConfig);
    165   assert(m_pObjLinker != NULL);
    166 
    167   // 6. - read all relocation entries from input files
    168   //   For all relocation sections of each input file (in the tree),
    169   //   read out reloc entry info from the object file and accordingly
    170   //   initiate their reloc entries in SectOrRelocData of LDSection.
    171   //
    172   //   To collect all edges in the reference graph.
    173   m_pObjLinker->readRelocations();
    174 
    175   // 7. - merge all sections
    176   //   Push sections into Module's SectionTable.
    177   //   Merge sections that have the same name.
    178   //   Maintain them as fragments in the section.
    179   //
    180   //   To merge nodes of the reference graph.
    181   if (!m_pObjLinker->mergeSections())
    182     return false;
    183 
    184   // 8. - allocateCommonSymbols
    185   //   Allocate fragments for common symbols to the corresponding sections.
    186   if (!m_pObjLinker->allocateCommonSymbols())
    187     return false;
    188   return true;
    189 }
    190 
    191 bool Linker::layout()
    192 {
    193   assert(NULL != m_pConfig && NULL != m_pObjLinker);
    194 
    195   // 9. - add standard symbols, target-dependent symbols and script symbols
    196   // m_pObjLinker->addUndefSymbols();
    197   if (!m_pObjLinker->addStandardSymbols() ||
    198       !m_pObjLinker->addTargetSymbols() ||
    199       !m_pObjLinker->addScriptSymbols())
    200     return false;
    201 
    202   // 10. - scan all relocation entries by output symbols.
    203   //   reserve GOT space for layout.
    204   //   the space info is needed by pre-layout to compute the section size
    205   m_pObjLinker->scanRelocations();
    206 
    207   // 11.a - init relaxation stuff.
    208   m_pObjLinker->initStubs();
    209 
    210   // 11.b - pre-layout
    211   m_pObjLinker->prelayout();
    212 
    213   // 11.c - linear layout
    214   //   Decide which sections will be left in. Sort the sections according to
    215   //   a given order. Then, create program header accordingly.
    216   //   Finally, set the offset for sections (@ref LDSection)
    217   //   according to the new order.
    218   m_pObjLinker->layout();
    219 
    220   // 11.d - post-layout (create segment, instruction relaxing)
    221   m_pObjLinker->postlayout();
    222 
    223   // 12. - finalize symbol value
    224   m_pObjLinker->finalizeSymbolValue();
    225 
    226   // 13. - apply relocations
    227   m_pObjLinker->relocation();
    228 
    229   if (!Diagnose())
    230     return false;
    231   return true;
    232 }
    233 
    234 bool Linker::emit(MemoryArea& pOutput)
    235 {
    236   // 13. - write out output
    237   m_pObjLinker->emitOutput(pOutput);
    238 
    239   // 14. - post processing
    240   m_pObjLinker->postProcessing(pOutput);
    241 
    242   if (!Diagnose())
    243     return false;
    244 
    245   return true;
    246 }
    247 
    248 bool Linker::emit(const std::string& pPath)
    249 {
    250   FileHandle file;
    251   FileHandle::Permission perm = FileHandle::Permission(0x755);
    252   if (!file.open(pPath,
    253             FileHandle::ReadWrite | FileHandle::Truncate | FileHandle::Create,
    254             perm)) {
    255     error(diag::err_cannot_open_output_file) << "Linker::emit()" << pPath;
    256     return false;
    257   }
    258 
    259   MemoryArea* output = new MemoryArea(file);
    260 
    261   bool result = emit(*output);
    262 
    263   delete output;
    264   file.close();
    265   return result;
    266 }
    267 
    268 bool Linker::emit(int pFileDescriptor)
    269 {
    270   FileHandle file;
    271   file.delegate(pFileDescriptor);
    272   MemoryArea* output = new MemoryArea(file);
    273 
    274   bool result = emit(*output);
    275 
    276   delete output;
    277   file.close();
    278   return result;
    279 }
    280 
    281 bool Linker::reset()
    282 {
    283   m_pConfig = NULL;
    284   m_pIRBuilder = NULL;
    285   m_pTarget = NULL;
    286 
    287   // Because llvm::iplist will touch the removed node, we must clear
    288   // RelocData before deleting target backend.
    289   RelocData::Clear();
    290   SectionData::Clear();
    291   EhFrame::Clear();
    292 
    293   delete m_pBackend;
    294   m_pBackend = NULL;
    295 
    296   delete m_pObjLinker;
    297   m_pObjLinker = NULL;
    298 
    299   LDSection::Clear();
    300   LDSymbol::Clear();
    301   FragmentRef::Clear();
    302   Relocation::Clear();
    303   return true;
    304 }
    305 
    306 bool Linker::initTarget()
    307 {
    308   assert(NULL != m_pConfig);
    309 
    310   std::string error;
    311   m_pTarget = mcld::TargetRegistry::lookupTarget(m_pConfig->targets().triple().str(), error);
    312   if (NULL == m_pTarget) {
    313     fatal(diag::fatal_cannot_init_target) << m_pConfig->targets().triple().str() << error;
    314     return false;
    315   }
    316   return true;
    317 }
    318 
    319 bool Linker::initBackend()
    320 {
    321   assert(NULL != m_pTarget);
    322   m_pBackend = m_pTarget->createLDBackend(*m_pConfig);
    323   if (NULL == m_pBackend) {
    324     fatal(diag::fatal_cannot_init_backend) << m_pConfig->targets().triple().str();
    325     return false;
    326   }
    327   return true;
    328 }
    329 
    330 bool Linker::initOStream()
    331 {
    332   assert(NULL != m_pConfig);
    333 
    334   mcld::outs().setColor(m_pConfig->options().color());
    335   mcld::errs().setColor(m_pConfig->options().color());
    336 
    337   return true;
    338 }
    339 
    340 bool Linker::initEmulator(LinkerScript& pScript)
    341 {
    342   assert(NULL != m_pTarget && NULL != m_pConfig);
    343   return m_pTarget->emulate(pScript, *m_pConfig);
    344 }
    345 
    346