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