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