• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- GeneralOptions.h ---------------------------------------------------===//
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 #ifndef MCLD_GENERALOPTIONS_H
10 #define MCLD_GENERALOPTIONS_H
11 #include <mcld/Support/RealPath.h>
12 #include <mcld/Support/FileSystem.h>
13 #include <string>
14 #include <vector>
15 #include <set>
16 
17 namespace mcld {
18 
19 class Input;
20 class ZOption;
21 
22 /** \class GeneralOptions
23  *  \brief GeneralOptions collects the options that not be one of the
24  *     - input files
25  *     - attribute of input files
26  */
27 class GeneralOptions
28 {
29 public:
30   enum StripSymbolMode {
31     KeepAllSymbols,
32     StripTemporaries,
33     StripLocals,
34     StripAllSymbols
35   };
36 
37   enum HashStyle {
38     SystemV = 0x1,
39     GNU     = 0x2,
40     Both    = 0x3
41   };
42 
43   enum ICF {
44     ICF_None,
45     ICF_All,
46     ICF_Safe
47   };
48 
49   typedef std::vector<std::string> RpathList;
50   typedef RpathList::iterator rpath_iterator;
51   typedef RpathList::const_iterator const_rpath_iterator;
52 
53   typedef std::vector<std::string> ScriptList;
54   typedef ScriptList::iterator script_iterator;
55   typedef ScriptList::const_iterator const_script_iterator;
56 
57   typedef std::vector<std::string> AuxiliaryList;
58   typedef AuxiliaryList::iterator aux_iterator;
59   typedef AuxiliaryList::const_iterator const_aux_iterator;
60 
61   typedef std::vector<std::string> UndefSymList;
62   typedef UndefSymList::iterator undef_sym_iterator;
63   typedef UndefSymList::const_iterator const_undef_sym_iterator;
64 
65   typedef std::set<std::string> ExcludeLIBS;
66 
67 public:
68   GeneralOptions();
69   ~GeneralOptions();
70 
71   /// trace
72   void setTrace(bool pEnableTrace = true)
73   { m_bTrace = pEnableTrace; }
74 
trace()75   bool trace() const
76   { return m_bTrace; }
77 
78   void setBsymbolic(bool pBsymbolic = true)
79   { m_Bsymbolic = pBsymbolic; }
80 
Bsymbolic()81   bool Bsymbolic() const
82   { return m_Bsymbolic; }
83 
84   void setPIE(bool pPIE = true)
85   { m_bPIE = pPIE; }
86 
isPIE()87   bool isPIE() const
88   { return m_bPIE; }
89 
90   void setBgroup(bool pBgroup = true)
91   { m_Bgroup = pBgroup; }
92 
Bgroup()93   bool Bgroup() const
94   { return m_Bgroup; }
95 
setDyld(const std::string & pDyld)96   void setDyld(const std::string& pDyld)
97   { m_Dyld = pDyld; }
98 
dyld()99   const std::string& dyld() const
100   { return m_Dyld; }
101 
hasDyld()102   bool hasDyld() const
103   { return !m_Dyld.empty(); }
104 
105   void setSOName(const std::string& pName);
106 
soname()107   const std::string& soname() const
108   { return m_SOName; }
109 
110   void setVerbose(int8_t pVerbose = -1)
111   { m_Verbose = pVerbose; }
112 
verbose()113   int8_t verbose() const
114   { return m_Verbose; }
115 
setMaxErrorNum(int16_t pNum)116   void setMaxErrorNum(int16_t pNum)
117   { m_MaxErrorNum = pNum; }
118 
maxErrorNum()119   int16_t maxErrorNum() const
120   { return m_MaxErrorNum; }
121 
setMaxWarnNum(int16_t pNum)122   void setMaxWarnNum(int16_t pNum)
123   { m_MaxWarnNum = pNum; }
124 
maxWarnNum()125   int16_t maxWarnNum() const
126   { return m_MaxWarnNum; }
127 
128   void setColor(bool pEnabled = true)
129   { m_bColor = pEnabled; }
130 
color()131   bool color() const
132   { return m_bColor; }
133 
134   void setNoUndefined(bool pEnable = true)
135   { m_NoUndefined = (pEnable?YES:NO); }
136 
137   void setMulDefs(bool pEnable = true)
138   { m_MulDefs = (pEnable?YES:NO); }
139 
140   void setEhFrameHdr(bool pEnable = true)
141   { m_bCreateEhFrameHdr = pEnable; }
142 
143   ///  -----  the -z options  -----  ///
144   void addZOption(const mcld::ZOption& pOption);
145 
hasCombReloc()146   bool hasCombReloc() const
147   { return m_bCombReloc; }
148 
hasNoUndefined()149   bool hasNoUndefined() const
150   { return (Unknown != m_NoUndefined); }
151 
isNoUndefined()152   bool isNoUndefined() const
153   { return (YES == m_NoUndefined); }
154 
hasStackSet()155   bool hasStackSet() const
156   { return (Unknown != m_ExecStack); }
157 
hasExecStack()158   bool hasExecStack() const
159   { return (YES == m_ExecStack); }
160 
hasInitFirst()161   bool hasInitFirst() const
162   { return m_bInitFirst; }
163 
hasInterPose()164   bool hasInterPose() const
165   { return m_bInterPose; }
166 
hasLoadFltr()167   bool hasLoadFltr() const
168   { return m_bLoadFltr; }
169 
hasMulDefs()170   bool hasMulDefs() const
171   { return (Unknown != m_MulDefs); }
172 
isMulDefs()173   bool isMulDefs() const
174   { return (YES == m_MulDefs); }
175 
hasNoCopyReloc()176   bool hasNoCopyReloc() const
177   { return m_bNoCopyReloc; }
178 
hasNoDefaultLib()179   bool hasNoDefaultLib() const
180   { return m_bNoDefaultLib; }
181 
hasNoDelete()182   bool hasNoDelete() const
183   { return m_bNoDelete; }
184 
hasNoDLOpen()185   bool hasNoDLOpen() const
186   { return m_bNoDLOpen; }
187 
hasNoDump()188   bool hasNoDump() const
189   { return m_bNoDump; }
190 
hasRelro()191   bool hasRelro() const
192   { return m_bRelro; }
193 
hasNow()194   bool hasNow() const
195   { return m_bNow; }
196 
hasOrigin()197   bool hasOrigin() const
198   { return m_bOrigin; }
199 
commPageSize()200   uint64_t commPageSize() const
201   { return m_CommPageSize; }
202 
maxPageSize()203   uint64_t maxPageSize() const
204   { return m_MaxPageSize; }
205 
hasEhFrameHdr()206   bool hasEhFrameHdr() const
207   { return m_bCreateEhFrameHdr; }
208 
209   // -n, --nmagic
210   void setNMagic(bool pMagic = true)
211   { m_bNMagic = pMagic; }
212 
nmagic()213   bool nmagic() const
214   { return m_bNMagic; }
215 
216   // -N, --omagic
217   void setOMagic(bool pMagic = true)
218   { m_bOMagic = pMagic; }
219 
omagic()220   bool omagic() const
221   { return m_bOMagic; }
222 
223   // -S, --strip-debug
224   void setStripDebug(bool pStripDebug = true)
225   { m_bStripDebug = pStripDebug; }
226 
stripDebug()227   bool stripDebug() const
228   { return m_bStripDebug; }
229 
230   // -E, --export-dynamic
231   void setExportDynamic(bool pExportDynamic = true)
232   { m_bExportDynamic = pExportDynamic; }
233 
exportDynamic()234   bool exportDynamic() const
235   { return m_bExportDynamic; }
236 
237   // --warn-shared-textrel
238   void setWarnSharedTextrel(bool pWarnSharedTextrel = true)
239   { m_bWarnSharedTextrel = pWarnSharedTextrel; }
240 
warnSharedTextrel()241   bool warnSharedTextrel() const
242   { return m_bWarnSharedTextrel; }
243 
244   void setBinaryInput(bool pBinaryInput = true)
245   { m_bBinaryInput = pBinaryInput; }
246 
isBinaryInput()247   bool isBinaryInput() const
248   { return m_bBinaryInput; }
249 
250   void setDefineCommon(bool pEnable = true)
251   { m_bDefineCommon = pEnable; }
252 
isDefineCommon()253   bool isDefineCommon() const
254   { return m_bDefineCommon; }
255 
256   void setFatalWarnings(bool pEnable = true)
257   { m_bFatalWarnings = pEnable; }
258 
isFatalWarnings()259   bool isFatalWarnings() const
260   { return m_bFatalWarnings; }
261 
getStripSymbolMode()262   StripSymbolMode getStripSymbolMode() const
263   { return m_StripSymbols; }
264 
setStripSymbols(StripSymbolMode pMode)265   void setStripSymbols(StripSymbolMode pMode)
266   { m_StripSymbols = pMode; }
267 
268   void setNewDTags(bool pEnable = true)
269   { m_bNewDTags = pEnable; }
270 
hasNewDTags()271   bool hasNewDTags() const
272   { return m_bNewDTags; }
273 
274   void setNoStdlib(bool pEnable = true)
275   { m_bNoStdlib = pEnable; }
276 
nostdlib()277   bool nostdlib() const
278   { return m_bNoStdlib; }
279 
280   // -M, --print-map
281   void setPrintMap(bool pEnable = true)
282   { m_bPrintMap = pEnable; }
283 
printMap()284   bool printMap() const
285   { return m_bPrintMap; }
286 
287   void setWarnMismatch(bool pEnable = true)
288   { m_bWarnMismatch = pEnable; }
289 
warnMismatch()290   bool warnMismatch() const
291   { return m_bWarnMismatch; }
292 
293   // --gc-sections
294   void setGCSections(bool pEnable = true)
295   { m_bGCSections = pEnable; }
296 
GCSections()297   bool GCSections() const
298   { return m_bGCSections; }
299 
300   // --print-gc-sections
301   void setPrintGCSections(bool pEnable = true)
302   { m_bPrintGCSections = pEnable; }
303 
getPrintGCSections()304   bool getPrintGCSections() const
305   { return m_bPrintGCSections; }
306 
307   // --ld-generated-unwind-info
308   void setGenUnwindInfo(bool pEnable = true)
309   { m_bGenUnwindInfo = pEnable; }
310 
genUnwindInfo()311   bool genUnwindInfo() const
312   { return m_bGenUnwindInfo; }
313 
314   // -G, max GP size option
setGPSize(int gpsize)315   void setGPSize(int gpsize)
316   { m_GPSize = gpsize; }
317 
getGPSize()318   int getGPSize() const
319   { return m_GPSize; }
320 
getHashStyle()321   unsigned int getHashStyle() const { return m_HashStyle; }
322 
setHashStyle(unsigned int pStyle)323   void setHashStyle(unsigned int pStyle)
324   { m_HashStyle = pStyle; }
325 
getICFMode()326   ICF getICFMode() const { return m_ICF; }
327 
setICFMode(ICF pMode)328   void setICFMode(ICF pMode)
329   { m_ICF = pMode; }
330 
getICFIterations()331   size_t getICFIterations() const { return m_ICFIterations; }
332 
setICFIterations(size_t pNum)333   void setICFIterations(size_t pNum)
334   { m_ICFIterations = pNum; }
335 
printICFSections()336   bool printICFSections() const { return m_bPrintICFSections; }
337 
setPrintICFSections(bool pPrintICFSections)338   void setPrintICFSections(bool pPrintICFSections)
339   { m_bPrintICFSections = pPrintICFSections; }
340 
341   // -----  link-in rpath  ----- //
getRpathList()342   const RpathList& getRpathList() const { return m_RpathList; }
getRpathList()343   RpathList&       getRpathList()       { return m_RpathList; }
344 
rpath_begin()345   const_rpath_iterator rpath_begin() const { return m_RpathList.begin(); }
rpath_begin()346   rpath_iterator       rpath_begin()       { return m_RpathList.begin(); }
rpath_end()347   const_rpath_iterator rpath_end  () const { return m_RpathList.end();   }
rpath_end()348   rpath_iterator       rpath_end  ()       { return m_RpathList.end();   }
349 
350   // -----  link-in script  ----- //
getScriptList()351   const ScriptList& getScriptList() const { return m_ScriptList; }
getScriptList()352   ScriptList&       getScriptList()       { return m_ScriptList; }
353 
script_begin()354   const_script_iterator script_begin() const { return m_ScriptList.begin(); }
script_begin()355   script_iterator       script_begin()       { return m_ScriptList.begin(); }
script_end()356   const_script_iterator script_end  () const { return m_ScriptList.end();   }
script_end()357   script_iterator       script_end  ()       { return m_ScriptList.end();   }
358 
359   // -----  -u/--undefined, undefined symbols ----- //
getUndefSymList()360   const UndefSymList& getUndefSymList() const { return m_UndefSymList; }
getUndefSymList()361   UndefSymList&       getUndefSymList()       { return m_UndefSymList; }
362 
undef_sym_begin()363   const_undef_sym_iterator undef_sym_begin() const
364   { return m_UndefSymList.begin(); }
undef_sym_begin()365   undef_sym_iterator undef_sym_begin()
366   { return m_UndefSymList.begin(); }
367 
undef_sym_end()368   const_undef_sym_iterator undef_sym_end() const
369   { return m_UndefSymList.end(); }
undef_sym_end()370   undef_sym_iterator undef_sym_end()
371   { return m_UndefSymList.end(); }
372 
373   // -----  filter and auxiliary filter  ----- //
setFilter(const std::string & pFilter)374   void setFilter(const std::string& pFilter)
375   { m_Filter = pFilter; }
376 
filter()377   const std::string& filter() const
378   { return m_Filter; }
379 
hasFilter()380   bool hasFilter() const
381   { return !m_Filter.empty(); }
382 
getAuxiliaryList()383   const AuxiliaryList& getAuxiliaryList() const { return m_AuxiliaryList; }
getAuxiliaryList()384   AuxiliaryList&       getAuxiliaryList()       { return m_AuxiliaryList; }
385 
aux_begin()386   const_aux_iterator aux_begin() const { return m_AuxiliaryList.begin(); }
aux_begin()387   aux_iterator       aux_begin()       { return m_AuxiliaryList.begin(); }
aux_end()388   const_aux_iterator aux_end  () const { return m_AuxiliaryList.end();   }
aux_end()389   aux_iterator       aux_end  ()       { return m_AuxiliaryList.end();   }
390 
391   // -----  exclude libs  ----- //
excludeLIBS()392   ExcludeLIBS& excludeLIBS()
393   { return m_ExcludeLIBS; }
394 
395   bool isInExcludeLIBS(const Input& pInput) const;
396 
397 
398 private:
399   enum status {
400     YES,
401     NO,
402     Unknown
403   };
404 
405 private:
406   std::string m_DefaultLDScript;
407   std::string m_Dyld;
408   std::string m_SOName;
409   int8_t m_Verbose;            // --verbose[=0,1,2]
410   uint16_t m_MaxErrorNum;      // --error-limit=N
411   uint16_t m_MaxWarnNum;       // --warning-limit=N
412   status m_ExecStack;          // execstack, noexecstack
413   status m_NoUndefined;        // defs, --no-undefined
414   status m_MulDefs;            // muldefs, --allow-multiple-definition
415   uint64_t m_CommPageSize;     // common-page-size=value
416   uint64_t m_MaxPageSize;      // max-page-size=value
417   bool m_bCombReloc     : 1;   // combreloc, nocombreloc
418   bool m_bInitFirst     : 1;   // initfirst
419   bool m_bInterPose     : 1;   // interpose
420   bool m_bLoadFltr      : 1;   // loadfltr
421   bool m_bNoCopyReloc   : 1;   // nocopyreloc
422   bool m_bNoDefaultLib  : 1;   // nodefaultlib
423   bool m_bNoDelete      : 1;   // nodelete
424   bool m_bNoDLOpen      : 1;   // nodlopen
425   bool m_bNoDump        : 1;   // nodump
426   bool m_bRelro         : 1;   // relro, norelro
427   bool m_bNow           : 1;   // lazy, now
428   bool m_bOrigin        : 1;   // origin
429   bool m_bTrace         : 1;   // --trace
430   bool m_Bsymbolic      : 1;   // --Bsymbolic
431   bool m_Bgroup         : 1;
432   bool m_bPIE           : 1;
433   bool m_bColor         : 1;   // --color[=true,false,auto]
434   bool m_bCreateEhFrameHdr : 1;    // --eh-frame-hdr
435   bool m_bNMagic : 1; // -n, --nmagic
436   bool m_bOMagic : 1; // -N, --omagic
437   bool m_bStripDebug : 1; // -S, --strip-debug
438   bool m_bExportDynamic :1; //-E, --export-dynamic
439   bool m_bWarnSharedTextrel : 1; // --warn-shared-textrel
440   bool m_bBinaryInput : 1; // -b [input-format], --format=[input-format]
441   bool m_bDefineCommon : 1; // -d, -dc, -dp
442   bool m_bFatalWarnings : 1; // --fatal-warnings
443   bool m_bNewDTags: 1; // --enable-new-dtags
444   bool m_bNoStdlib: 1; // -nostdlib
445   bool m_bPrintMap: 1; // --print-map
446   bool m_bWarnMismatch: 1; // --no-warn-mismatch
447   bool m_bGCSections: 1; // --gc-sections
448   bool m_bPrintGCSections:1; // --print-gc-sections
449   bool m_bGenUnwindInfo: 1; // --ld-generated-unwind-info
450   bool m_bPrintICFSections: 1; // --print-icf-sections
451   ICF m_ICF;
452   size_t m_ICFIterations;
453   uint32_t m_GPSize; // -G, --gpsize
454   StripSymbolMode m_StripSymbols;
455   RpathList m_RpathList;
456   ScriptList m_ScriptList;
457   UndefSymList m_UndefSymList; // -u [symbol], --undefined [symbol]
458   unsigned int m_HashStyle;
459   std::string m_Filter;
460   AuxiliaryList m_AuxiliaryList;
461   ExcludeLIBS m_ExcludeLIBS;
462 };
463 
464 } // namespace of mcld
465 
466 #endif
467 
468