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