Home | History | Annotate | Download | only in lib
      1 //===- DynamicSectionOptions.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/DynamicSectionOptions.h>
     10 #include <mcld/LinkerConfig.h>
     11 #include <mcld/LinkerScript.h>
     12 #include <mcld/MC/ZOption.h>
     13 
     14 namespace {
     15 
     16 llvm::cl::opt<std::string> ArgEntry("e",
     17   llvm::cl::desc("Use the explicit symbol as the entrance of your program."),
     18   llvm::cl::value_desc("entry"),
     19   llvm::cl::ValueRequired);
     20 
     21 llvm::cl::alias ArgEntryAlias("entry",
     22   llvm::cl::desc("alias for -e"),
     23   llvm::cl::aliasopt(ArgEntry));
     24 
     25 llvm::cl::opt<bool> ArgBsymbolic("Bsymbolic",
     26   llvm::cl::ZeroOrMore,
     27   llvm::cl::desc("Bind references within the shared library."),
     28   llvm::cl::init(false));
     29 
     30 llvm::cl::opt<bool> ArgBgroup("Bgroup",
     31   llvm::cl::desc("Info the dynamic linker to lookups only inside the group."),
     32   llvm::cl::init(false));
     33 
     34 llvm::cl::opt<std::string> ArgSOName("soname",
     35   llvm::cl::desc("Set internal name of shared library"),
     36   llvm::cl::value_desc("name"));
     37 
     38 llvm::cl::opt<llvm::cl::boolOrDefault> ArgNoUndefined("no-undefined",
     39   llvm::cl::ZeroOrMore,
     40   llvm::cl::desc("Do not allow unresolved references"));
     41 
     42 llvm::cl::opt<llvm::cl::boolOrDefault> ArgAllowMulDefs("allow-multiple-definition",
     43   llvm::cl::desc("Allow multiple definition"));
     44 
     45 llvm::cl::list<mcld::ZOption,
     46                bool,
     47                llvm::cl::parser<mcld::ZOption> > ArgZOptionList("z",
     48   llvm::cl::ZeroOrMore,
     49   llvm::cl::desc("The -z options for GNU ld compatibility."),
     50   llvm::cl::value_desc("keyword"),
     51   llvm::cl::Prefix);
     52 
     53 llvm::cl::opt<std::string> ArgDyld("dynamic-linker",
     54   llvm::cl::ZeroOrMore,
     55   llvm::cl::desc("Set the name of the dynamic linker."),
     56   llvm::cl::value_desc("Program"));
     57 
     58 llvm::cl::opt<bool> ArgEnableNewDTags("enable-new-dtags",
     59   llvm::cl::desc("Enable use of DT_RUNPATH and DT_FLAGS"),
     60   llvm::cl::init(false));
     61 
     62 // Not supported yet {
     63 llvm::cl::list<std::string> ArgAuxiliary("f",
     64   llvm::cl::ZeroOrMore,
     65   llvm::cl::desc("Auxiliary filter for shared object symbol table"),
     66   llvm::cl::value_desc("name"));
     67 
     68 llvm::cl::alias ArgAuxiliaryAlias("auxiliary",
     69   llvm::cl::desc("alias for -f"),
     70   llvm::cl::aliasopt(ArgAuxiliary));
     71 
     72 llvm::cl::opt<std::string> ArgFilter("F",
     73   llvm::cl::desc("Filter for shared object symbol table"),
     74   llvm::cl::value_desc("name"));
     75 
     76 llvm::cl::alias ArgFilterAlias("filter",
     77   llvm::cl::desc("alias for -F"),
     78   llvm::cl::aliasopt(ArgFilter));
     79 
     80 // } Not supported yet
     81 
     82 } // anonymous namespace
     83 
     84 using namespace mcld;
     85 
     86 //===----------------------------------------------------------------------===//
     87 // DynamicSectionOptions
     88 //===----------------------------------------------------------------------===//
     89 DynamicSectionOptions::DynamicSectionOptions()
     90   : m_Entry(ArgEntry),
     91     m_Bsymbolic(ArgBsymbolic),
     92     m_Bgroup(ArgBgroup),
     93     m_SOName(ArgSOName),
     94     m_NoUndefined(ArgNoUndefined),
     95     m_AllowMulDefs(ArgAllowMulDefs),
     96     m_ZOptionList(ArgZOptionList),
     97     m_Dyld(ArgDyld),
     98     m_EnableNewDTags(ArgEnableNewDTags),
     99     m_Auxiliary(ArgAuxiliary),
    100     m_Filter(ArgFilter) {
    101 }
    102 
    103 bool DynamicSectionOptions::parse(LinkerConfig& pConfig, LinkerScript& pScript)
    104 {
    105   // set up entry point from -e
    106   pScript.setEntry(m_Entry);
    107 
    108   // --Bsymbolic
    109   pConfig.options().setBsymbolic(m_Bsymbolic);
    110 
    111   // --Bgroup
    112   pConfig.options().setBgroup(m_Bgroup);
    113 
    114   // set --soname [soname]
    115   pConfig.options().setSOName(m_SOName);
    116 
    117   // set -z options
    118   llvm::cl::list<ZOption>::iterator zOpt;
    119   llvm::cl::list<ZOption>::iterator zOptEnd = m_ZOptionList.end();
    120   for (zOpt = m_ZOptionList.begin(); zOpt != zOptEnd; ++zOpt) {
    121     pConfig.options().addZOption(*zOpt);
    122   }
    123 
    124   // set --no-undefined
    125   if (llvm::cl::BOU_UNSET != m_NoUndefined)
    126     pConfig.options().setNoUndefined(llvm::cl::BOU_TRUE == m_NoUndefined);
    127 
    128   // set --allow-multiple-definition
    129   if (llvm::cl::BOU_UNSET != m_AllowMulDefs)
    130     pConfig.options().setMulDefs(llvm::cl::BOU_TRUE == m_AllowMulDefs);
    131 
    132   // set --dynamic-linker [dyld]
    133   pConfig.options().setDyld(m_Dyld);
    134 
    135   // set --enable-new-dtags
    136   pConfig.options().setNewDTags(m_EnableNewDTags);
    137 
    138   // set --auxiliary, -f
    139   llvm::cl::list<std::string>::iterator aux;
    140   llvm::cl::list<std::string>::iterator auxEnd = m_Auxiliary.end();
    141   for (aux = m_Auxiliary.begin(); aux != auxEnd; ++aux)
    142     pConfig.options().getAuxiliaryList().push_back(*aux);
    143 
    144   // set --filter, -F
    145   pConfig.options().setFilter(m_Filter);
    146 
    147   return true;
    148 }
    149 
    150