GeneralOptions.cpp revision 0dea6bc96bb52346737966839ac68644f7939f58
1//===- GeneralOptions.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/GeneralOptions.h>
10#include <mcld/MC/Input.h>
11#include <mcld/MC/ZOption.h>
12#include <cassert>
13
14using namespace mcld;
15
16//===----------------------------------------------------------------------===//
17// GeneralOptions
18//===----------------------------------------------------------------------===//
19GeneralOptions::GeneralOptions()
20  : m_Verbose(-1),
21    m_MaxErrorNum(-1),
22    m_MaxWarnNum(-1),
23    m_ExecStack(Unknown),
24    m_NoUndefined(Unknown),
25    m_MulDefs(Unknown),
26    m_CommPageSize(0x0),
27    m_MaxPageSize(0x0),
28    m_bCombReloc(true),
29    m_bInitFirst(false),
30    m_bInterPose(false),
31    m_bLoadFltr(false),
32    m_bNoCopyReloc(false),
33    m_bNoDefaultLib(false),
34    m_bNoDelete(false),
35    m_bNoDLOpen(false),
36    m_bNoDump(false),
37    m_bRelro(false),
38    m_bNow(false),
39    m_bOrigin(false),
40    m_bTrace(false),
41    m_Bsymbolic(false),
42    m_Bgroup(false),
43    m_bPIE(false),
44    m_bColor(true),
45    m_bCreateEhFrameHdr(false),
46    m_bNMagic(false),
47    m_bOMagic(false),
48    m_bStripDebug(false),
49    m_bExportDynamic(false),
50    m_bWarnSharedTextrel(false),
51    m_bBinaryInput(false),
52    m_bDefineCommon(false),
53    m_bFatalWarnings(false),
54    m_bNewDTags(false),
55    m_bNoStdlib(false),
56    m_bWarnMismatch(true),
57    m_bGCSections(false),
58    m_bPrintGCSections(false),
59    m_bGenUnwindInfo(true),
60    m_bPrintICFSections(false),
61    m_ICF(ICF_None),
62    m_ICFIterations(0) ,
63    m_GPSize(8),
64    m_StripSymbols(KeepAllSymbols),
65    m_HashStyle(SystemV) {
66}
67
68GeneralOptions::~GeneralOptions()
69{
70}
71
72void GeneralOptions::setSOName(const std::string& pName)
73{
74  size_t pos = pName.find_last_of(sys::fs::separator);
75  if (std::string::npos == pos)
76    m_SOName = pName;
77  else
78    m_SOName = pName.substr(pos + 1);
79}
80
81void GeneralOptions::addZOption(const ZOption& pOption)
82{
83  switch (pOption.kind()) {
84    case ZOption::CombReloc:
85      m_bCombReloc = true;
86      break;
87    case ZOption::NoCombReloc:
88      m_bCombReloc = false;
89      break;
90    case ZOption::Defs:
91      m_NoUndefined = YES;
92      break;
93    case ZOption::ExecStack:
94      m_ExecStack = YES;
95      break;
96    case ZOption::NoExecStack:
97      m_ExecStack = NO;
98      break;
99    case ZOption::InitFirst:
100      m_bInitFirst = true;
101      break;
102    case ZOption::InterPose:
103      m_bInterPose = true;
104      break;
105    case ZOption::LoadFltr:
106      m_bLoadFltr = true;
107      break;
108    case ZOption::MulDefs:
109      m_MulDefs = YES;
110      break;
111    case ZOption::NoCopyReloc:
112      m_bNoCopyReloc = true;
113      break;
114    case ZOption::NoDefaultLib:
115      m_bNoDefaultLib = true;
116      break;
117    case ZOption::NoDelete:
118      m_bNoDelete = true;
119      break;
120    case ZOption::NoDLOpen:
121      m_bNoDLOpen = true;
122      break;
123    case ZOption::NoDump:
124      m_bNoDump = true;
125      break;
126    case ZOption::NoRelro:
127      m_bRelro = false;
128      break;
129    case ZOption::Relro:
130      m_bRelro = true;
131      break;
132    case ZOption::Lazy:
133      m_bNow = false;
134      break;
135    case ZOption::Now:
136      m_bNow = true;
137      break;
138    case ZOption::Origin:
139      m_bOrigin = true;
140      break;
141    case ZOption::CommPageSize:
142      m_CommPageSize = pOption.pageSize();
143      break;
144    case ZOption::MaxPageSize:
145      m_MaxPageSize = pOption.pageSize();
146      break;
147    case ZOption::Unknown:
148    default:
149      assert(false && "Not a recognized -z option.");
150      break;
151  }
152}
153
154bool GeneralOptions::isInExcludeLIBS(const Input& pInput) const
155{
156  assert(pInput.type() == Input::Archive);
157
158  if (m_ExcludeLIBS.empty()) {
159    return false;
160  }
161
162  // Specifying "--exclude-libs ALL" excludes symbols in all archive libraries
163  // from automatic export.
164  if (m_ExcludeLIBS.count("ALL") != 0) {
165    return true;
166  }
167
168  std::string name(pInput.name());
169  name.append(".a");
170  if (m_ExcludeLIBS.count(name) != 0) {
171    return true;
172  }
173
174  return false;
175}
176