DynamicSectionOptions.cpp revision 533eae20118036f425f27bf0536ef0ccbb090b65
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 14namespace { 15 16llvm::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 21llvm::cl::alias ArgEntryAlias("entry", 22 llvm::cl::desc("alias for -e"), 23 llvm::cl::aliasopt(ArgEntry)); 24 25llvm::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 30llvm::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 34llvm::cl::opt<std::string> ArgSOName("soname", 35 llvm::cl::desc("Set internal name of shared library"), 36 llvm::cl::value_desc("name")); 37 38llvm::cl::opt<llvm::cl::boolOrDefault> ArgNoUndefined("no-undefined", 39 llvm::cl::ZeroOrMore, 40 llvm::cl::desc("Do not allow unresolved references")); 41 42llvm::cl::opt<llvm::cl::boolOrDefault> ArgAllowMulDefs("allow-multiple-definition", 43 llvm::cl::desc("Allow multiple definition")); 44 45llvm::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 53llvm::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 58llvm::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 { 63llvm::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 68llvm::cl::alias ArgAuxiliaryAlias("auxiliary", 69 llvm::cl::desc("alias for -f"), 70 llvm::cl::aliasopt(ArgAuxiliary)); 71 72llvm::cl::opt<std::string> ArgFilter("F", 73 llvm::cl::desc("Filter for shared object symbol table"), 74 llvm::cl::value_desc("name")); 75 76llvm::cl::alias ArgFilterAlias("filter", 77 llvm::cl::desc("alias for -F"), 78 llvm::cl::aliasopt(ArgFilterAlias)); 79 80// } Not supported yet 81 82} // anonymous namespace 83 84using namespace mcld; 85 86//===----------------------------------------------------------------------===// 87// DynamicSectionOptions 88//===----------------------------------------------------------------------===// 89DynamicSectionOptions::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 103bool 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