You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
399 lines
12 KiB
399 lines
12 KiB
//===- GeneralOptions.h ---------------------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef MCLD_GENERALOPTIONS_H_
|
|
#define MCLD_GENERALOPTIONS_H_
|
|
#include "mcld/Config/Config.h"
|
|
#include "mcld/Support/RealPath.h"
|
|
#include "mcld/Support/FileSystem.h"
|
|
#include <string>
|
|
#include <vector>
|
|
#include <set>
|
|
|
|
namespace mcld {
|
|
|
|
class Input;
|
|
class ZOption;
|
|
|
|
/** \class GeneralOptions
|
|
* \brief GeneralOptions collects the options that not be one of the
|
|
* - input files
|
|
* - attribute of input files
|
|
*/
|
|
class GeneralOptions {
|
|
public:
|
|
enum class StripSymbolMode {
|
|
KeepAllSymbols,
|
|
StripTemporaries,
|
|
StripLocals,
|
|
StripAllSymbols
|
|
};
|
|
|
|
enum class HashStyle : uint8_t {
|
|
Unknown = 0x0,
|
|
SystemV = 0x1,
|
|
GNU = 0x2,
|
|
Both = 0x3
|
|
};
|
|
|
|
enum class ICF {
|
|
Unknown,
|
|
None,
|
|
All,
|
|
Safe
|
|
};
|
|
|
|
typedef std::vector<std::string> RpathList;
|
|
typedef RpathList::iterator rpath_iterator;
|
|
typedef RpathList::const_iterator const_rpath_iterator;
|
|
|
|
typedef std::vector<std::string> ScriptList;
|
|
typedef ScriptList::iterator script_iterator;
|
|
typedef ScriptList::const_iterator const_script_iterator;
|
|
|
|
typedef std::vector<std::string> AuxiliaryList;
|
|
typedef AuxiliaryList::iterator aux_iterator;
|
|
typedef AuxiliaryList::const_iterator const_aux_iterator;
|
|
|
|
typedef std::vector<std::string> UndefSymList;
|
|
typedef UndefSymList::iterator undef_sym_iterator;
|
|
typedef UndefSymList::const_iterator const_undef_sym_iterator;
|
|
|
|
typedef std::set<std::string> ExcludeLIBS;
|
|
|
|
public:
|
|
GeneralOptions();
|
|
~GeneralOptions();
|
|
|
|
/// trace
|
|
void setTrace(bool pEnableTrace = true) { m_bTrace = pEnableTrace; }
|
|
|
|
bool trace() const { return m_bTrace; }
|
|
|
|
void setBsymbolic(bool pBsymbolic = true) { m_Bsymbolic = pBsymbolic; }
|
|
|
|
bool Bsymbolic() const { return m_Bsymbolic; }
|
|
|
|
void setPIE(bool pPIE = true) { m_bPIE = pPIE; }
|
|
|
|
bool isPIE() const { return m_bPIE; }
|
|
|
|
void setBgroup(bool pBgroup = true) { m_Bgroup = pBgroup; }
|
|
|
|
bool Bgroup() const { return m_Bgroup; }
|
|
|
|
void setDyld(const std::string& pDyld) { m_Dyld = pDyld; }
|
|
|
|
const std::string& dyld() const { return m_Dyld; }
|
|
|
|
bool hasDyld() const { return !m_Dyld.empty(); }
|
|
|
|
void setSOName(const std::string& pName);
|
|
|
|
const std::string& soname() const { return m_SOName; }
|
|
|
|
void setVerbose(int8_t pVerbose = -1) { m_Verbose = pVerbose; }
|
|
|
|
int8_t verbose() const { return m_Verbose; }
|
|
|
|
void setMaxErrorNum(int16_t pNum) { m_MaxErrorNum = pNum; }
|
|
|
|
int16_t maxErrorNum() const { return m_MaxErrorNum; }
|
|
|
|
void setMaxWarnNum(int16_t pNum) { m_MaxWarnNum = pNum; }
|
|
|
|
int16_t maxWarnNum() const { return m_MaxWarnNum; }
|
|
|
|
void setColor(bool pEnabled = true) { m_bColor = pEnabled; }
|
|
|
|
bool color() const { return m_bColor; }
|
|
|
|
void setNoUndefined(bool pEnable = true) {
|
|
m_NoUndefined = (pEnable ? YES : NO);
|
|
}
|
|
|
|
void setNumSpareDTags(uint32_t pNum) {
|
|
m_NumSpareDTags = pNum;
|
|
}
|
|
|
|
unsigned getNumSpareDTags() const { return m_NumSpareDTags; }
|
|
|
|
void setMulDefs(bool pEnable = true) { m_MulDefs = (pEnable ? YES : NO); }
|
|
|
|
void setEhFrameHdr(bool pEnable = true) { m_bCreateEhFrameHdr = pEnable; }
|
|
|
|
/// ----- the -z options ----- ///
|
|
void addZOption(const mcld::ZOption& pOption);
|
|
|
|
bool hasCombReloc() const { return m_bCombReloc; }
|
|
|
|
bool hasNoUndefined() const { return (Unknown != m_NoUndefined); }
|
|
|
|
bool isNoUndefined() const { return (YES == m_NoUndefined); }
|
|
|
|
bool hasStackSet() const { return (Unknown != m_ExecStack); }
|
|
|
|
bool hasExecStack() const { return (YES == m_ExecStack); }
|
|
|
|
bool hasInitFirst() const { return m_bInitFirst; }
|
|
|
|
bool hasInterPose() const { return m_bInterPose; }
|
|
|
|
bool hasLoadFltr() const { return m_bLoadFltr; }
|
|
|
|
bool hasMulDefs() const { return (Unknown != m_MulDefs); }
|
|
|
|
bool isMulDefs() const { return (YES == m_MulDefs); }
|
|
|
|
bool hasNoCopyReloc() const { return m_bNoCopyReloc; }
|
|
|
|
bool hasNoDefaultLib() const { return m_bNoDefaultLib; }
|
|
|
|
bool hasNoDelete() const { return m_bNoDelete; }
|
|
|
|
bool hasNoDLOpen() const { return m_bNoDLOpen; }
|
|
|
|
bool hasNoDump() const { return m_bNoDump; }
|
|
|
|
bool hasRelro() const { return m_bRelro; }
|
|
|
|
bool hasNow() const { return m_bNow; }
|
|
|
|
bool hasOrigin() const { return m_bOrigin; }
|
|
|
|
uint64_t commPageSize() const { return m_CommPageSize; }
|
|
|
|
uint64_t maxPageSize() const { return m_MaxPageSize; }
|
|
|
|
bool hasEhFrameHdr() const { return m_bCreateEhFrameHdr; }
|
|
|
|
// -n, --nmagic
|
|
void setNMagic(bool pMagic = true) { m_bNMagic = pMagic; }
|
|
|
|
bool nmagic() const { return m_bNMagic; }
|
|
|
|
// -N, --omagic
|
|
void setOMagic(bool pMagic = true) { m_bOMagic = pMagic; }
|
|
|
|
bool omagic() const { return m_bOMagic; }
|
|
|
|
// -S, --strip-debug
|
|
void setStripDebug(bool pStripDebug = true) { m_bStripDebug = pStripDebug; }
|
|
|
|
bool stripDebug() const { return m_bStripDebug; }
|
|
|
|
// -E, --export-dynamic
|
|
void setExportDynamic(bool pExportDynamic = true) {
|
|
m_bExportDynamic = pExportDynamic;
|
|
}
|
|
|
|
bool exportDynamic() const { return m_bExportDynamic; }
|
|
|
|
// --warn-shared-textrel
|
|
void setWarnSharedTextrel(bool pWarnSharedTextrel = true) {
|
|
m_bWarnSharedTextrel = pWarnSharedTextrel;
|
|
}
|
|
|
|
bool warnSharedTextrel() const { return m_bWarnSharedTextrel; }
|
|
|
|
void setBinaryInput(bool pBinaryInput = true) {
|
|
m_bBinaryInput = pBinaryInput;
|
|
}
|
|
|
|
bool isBinaryInput() const { return m_bBinaryInput; }
|
|
|
|
void setDefineCommon(bool pEnable = true) { m_bDefineCommon = pEnable; }
|
|
|
|
bool isDefineCommon() const { return m_bDefineCommon; }
|
|
|
|
void setFatalWarnings(bool pEnable = true) { m_bFatalWarnings = pEnable; }
|
|
|
|
bool isFatalWarnings() const { return m_bFatalWarnings; }
|
|
|
|
StripSymbolMode getStripSymbolMode() const { return m_StripSymbols; }
|
|
|
|
void setStripSymbols(StripSymbolMode pMode) { m_StripSymbols = pMode; }
|
|
|
|
void setNewDTags(bool pEnable = true) { m_bNewDTags = pEnable; }
|
|
|
|
bool hasNewDTags() const { return m_bNewDTags; }
|
|
|
|
void setNoStdlib(bool pEnable = true) { m_bNoStdlib = pEnable; }
|
|
|
|
bool nostdlib() const { return m_bNoStdlib; }
|
|
|
|
// -M, --print-map
|
|
void setPrintMap(bool pEnable = true) { m_bPrintMap = pEnable; }
|
|
|
|
bool printMap() const { return m_bPrintMap; }
|
|
|
|
void setWarnMismatch(bool pEnable = true) { m_bWarnMismatch = pEnable; }
|
|
|
|
bool warnMismatch() const { return m_bWarnMismatch; }
|
|
|
|
// --gc-sections
|
|
void setGCSections(bool pEnable = true) { m_bGCSections = pEnable; }
|
|
|
|
bool GCSections() const { return m_bGCSections; }
|
|
|
|
// --print-gc-sections
|
|
void setPrintGCSections(bool pEnable = true) { m_bPrintGCSections = pEnable; }
|
|
|
|
bool getPrintGCSections() const { return m_bPrintGCSections; }
|
|
|
|
// --ld-generated-unwind-info
|
|
void setGenUnwindInfo(bool pEnable = true) { m_bGenUnwindInfo = pEnable; }
|
|
|
|
bool genUnwindInfo() const { return m_bGenUnwindInfo; }
|
|
|
|
HashStyle getHashStyle() const { return m_HashStyle; }
|
|
|
|
bool hasGNUHash() const {
|
|
return m_HashStyle == HashStyle::GNU || m_HashStyle == HashStyle::Both;
|
|
}
|
|
|
|
bool hasSysVHash() const {
|
|
return m_HashStyle == HashStyle::SystemV || m_HashStyle == HashStyle::Both;
|
|
}
|
|
|
|
void setHashStyle(HashStyle pStyle) { m_HashStyle = pStyle; }
|
|
|
|
ICF getICFMode() const { return m_ICF; }
|
|
|
|
void setICFMode(ICF pMode) { m_ICF = pMode; }
|
|
|
|
size_t getICFIterations() const { return m_ICFIterations; }
|
|
|
|
void setICFIterations(size_t pNum) { m_ICFIterations = pNum; }
|
|
|
|
bool printICFSections() const { return m_bPrintICFSections; }
|
|
|
|
void setPrintICFSections(bool pPrintICFSections = true) {
|
|
m_bPrintICFSections = pPrintICFSections;
|
|
}
|
|
|
|
// ----- link-in rpath ----- //
|
|
const RpathList& getRpathList() const { return m_RpathList; }
|
|
RpathList& getRpathList() { return m_RpathList; }
|
|
|
|
const_rpath_iterator rpath_begin() const { return m_RpathList.begin(); }
|
|
rpath_iterator rpath_begin() { return m_RpathList.begin(); }
|
|
const_rpath_iterator rpath_end() const { return m_RpathList.end(); }
|
|
rpath_iterator rpath_end() { return m_RpathList.end(); }
|
|
|
|
// ----- link-in script ----- //
|
|
const ScriptList& getScriptList() const { return m_ScriptList; }
|
|
ScriptList& getScriptList() { return m_ScriptList; }
|
|
|
|
const_script_iterator script_begin() const { return m_ScriptList.begin(); }
|
|
script_iterator script_begin() { return m_ScriptList.begin(); }
|
|
const_script_iterator script_end() const { return m_ScriptList.end(); }
|
|
script_iterator script_end() { return m_ScriptList.end(); }
|
|
|
|
// ----- -u/--undefined, undefined symbols ----- //
|
|
const UndefSymList& getUndefSymList() const { return m_UndefSymList; }
|
|
UndefSymList& getUndefSymList() { return m_UndefSymList; }
|
|
|
|
const_undef_sym_iterator undef_sym_begin() const {
|
|
return m_UndefSymList.begin();
|
|
}
|
|
undef_sym_iterator undef_sym_begin() { return m_UndefSymList.begin(); }
|
|
|
|
const_undef_sym_iterator undef_sym_end() const {
|
|
return m_UndefSymList.end();
|
|
}
|
|
undef_sym_iterator undef_sym_end() { return m_UndefSymList.end(); }
|
|
|
|
// ----- filter and auxiliary filter ----- //
|
|
void setFilter(const std::string& pFilter) { m_Filter = pFilter; }
|
|
|
|
const std::string& filter() const { return m_Filter; }
|
|
|
|
bool hasFilter() const { return !m_Filter.empty(); }
|
|
|
|
const AuxiliaryList& getAuxiliaryList() const { return m_AuxiliaryList; }
|
|
AuxiliaryList& getAuxiliaryList() { return m_AuxiliaryList; }
|
|
|
|
const_aux_iterator aux_begin() const { return m_AuxiliaryList.begin(); }
|
|
aux_iterator aux_begin() { return m_AuxiliaryList.begin(); }
|
|
const_aux_iterator aux_end() const { return m_AuxiliaryList.end(); }
|
|
aux_iterator aux_end() { return m_AuxiliaryList.end(); }
|
|
|
|
// ----- exclude libs ----- //
|
|
ExcludeLIBS& excludeLIBS() { return m_ExcludeLIBS; }
|
|
|
|
bool isInExcludeLIBS(const Input& pInput) const;
|
|
|
|
const char* getVersionString() const { return PACKAGE_NAME " " MCLD_VERSION; }
|
|
|
|
private:
|
|
enum status { YES, NO, Unknown };
|
|
|
|
private:
|
|
std::string m_DefaultLDScript;
|
|
std::string m_Dyld;
|
|
std::string m_SOName;
|
|
int8_t m_Verbose; // --verbose[=0,1,2]
|
|
uint16_t m_MaxErrorNum; // --error-limit=N
|
|
uint16_t m_MaxWarnNum; // --warning-limit=N
|
|
unsigned m_NumSpareDTags; // --spare-dynamic-tags
|
|
status m_ExecStack; // execstack, noexecstack
|
|
status m_NoUndefined; // defs, --no-undefined
|
|
status m_MulDefs; // muldefs, --allow-multiple-definition
|
|
uint64_t m_CommPageSize; // common-page-size=value
|
|
uint64_t m_MaxPageSize; // max-page-size=value
|
|
bool m_bCombReloc : 1; // combreloc, nocombreloc
|
|
bool m_bInitFirst : 1; // initfirst
|
|
bool m_bInterPose : 1; // interpose
|
|
bool m_bLoadFltr : 1; // loadfltr
|
|
bool m_bNoCopyReloc : 1; // nocopyreloc
|
|
bool m_bNoDefaultLib : 1; // nodefaultlib
|
|
bool m_bNoDelete : 1; // nodelete
|
|
bool m_bNoDLOpen : 1; // nodlopen
|
|
bool m_bNoDump : 1; // nodump
|
|
bool m_bRelro : 1; // relro, norelro
|
|
bool m_bNow : 1; // lazy, now
|
|
bool m_bOrigin : 1; // origin
|
|
bool m_bTrace : 1; // --trace
|
|
bool m_Bsymbolic : 1; // --Bsymbolic
|
|
bool m_Bgroup : 1;
|
|
bool m_bPIE : 1;
|
|
bool m_bColor : 1; // --color[=true,false,auto]
|
|
bool m_bCreateEhFrameHdr : 1; // --eh-frame-hdr
|
|
bool m_bNMagic : 1; // -n, --nmagic
|
|
bool m_bOMagic : 1; // -N, --omagic
|
|
bool m_bStripDebug : 1; // -S, --strip-debug
|
|
bool m_bExportDynamic : 1; // -E, --export-dynamic
|
|
bool m_bWarnSharedTextrel : 1; // --warn-shared-textrel
|
|
bool m_bBinaryInput : 1; // -b [input-format], --format=[input-format]
|
|
bool m_bDefineCommon : 1; // -d, -dc, -dp
|
|
bool m_bFatalWarnings : 1; // --fatal-warnings
|
|
bool m_bNewDTags : 1; // --enable-new-dtags
|
|
bool m_bNoStdlib : 1; // -nostdlib
|
|
bool m_bPrintMap : 1; // --print-map
|
|
bool m_bWarnMismatch : 1; // --no-warn-mismatch
|
|
bool m_bGCSections : 1; // --gc-sections
|
|
bool m_bPrintGCSections : 1; // --print-gc-sections
|
|
bool m_bGenUnwindInfo : 1; // --ld-generated-unwind-info
|
|
bool m_bPrintICFSections : 1; // --print-icf-sections
|
|
ICF m_ICF;
|
|
size_t m_ICFIterations;
|
|
StripSymbolMode m_StripSymbols;
|
|
RpathList m_RpathList;
|
|
ScriptList m_ScriptList;
|
|
UndefSymList m_UndefSymList; // -u [symbol], --undefined [symbol]
|
|
HashStyle m_HashStyle;
|
|
std::string m_Filter;
|
|
AuxiliaryList m_AuxiliaryList;
|
|
ExcludeLIBS m_ExcludeLIBS;
|
|
};
|
|
|
|
} // namespace mcld
|
|
|
|
#endif // MCLD_GENERALOPTIONS_H_
|