174 lines
4.2 KiB
C++
174 lines
4.2 KiB
C++
//===- GeneralOptions.cpp -------------------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "mcld/GeneralOptions.h"
|
|
#include "mcld/MC/Input.h"
|
|
#include "mcld/MC/ZOption.h"
|
|
#include <cassert>
|
|
|
|
namespace mcld {
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// GeneralOptions
|
|
//===----------------------------------------------------------------------===//
|
|
GeneralOptions::GeneralOptions()
|
|
: m_Verbose(-1),
|
|
m_MaxErrorNum(-1),
|
|
m_MaxWarnNum(-1),
|
|
m_NumSpareDTags(5),
|
|
m_ExecStack(Unknown),
|
|
m_NoUndefined(Unknown),
|
|
m_MulDefs(Unknown),
|
|
m_CommPageSize(0x0),
|
|
m_MaxPageSize(0x0),
|
|
m_bCombReloc(true),
|
|
m_bInitFirst(false),
|
|
m_bInterPose(false),
|
|
m_bLoadFltr(false),
|
|
m_bNoCopyReloc(false),
|
|
m_bNoDefaultLib(false),
|
|
m_bNoDelete(false),
|
|
m_bNoDLOpen(false),
|
|
m_bNoDump(false),
|
|
m_bRelro(false),
|
|
m_bNow(false),
|
|
m_bOrigin(false),
|
|
m_bTrace(false),
|
|
m_Bsymbolic(false),
|
|
m_Bgroup(false),
|
|
m_bPIE(false),
|
|
m_bColor(true),
|
|
m_bCreateEhFrameHdr(false),
|
|
m_bNMagic(false),
|
|
m_bOMagic(false),
|
|
m_bStripDebug(false),
|
|
m_bExportDynamic(false),
|
|
m_bWarnSharedTextrel(false),
|
|
m_bBinaryInput(false),
|
|
m_bDefineCommon(false),
|
|
m_bFatalWarnings(false),
|
|
m_bNewDTags(false),
|
|
m_bNoStdlib(false),
|
|
m_bWarnMismatch(true),
|
|
m_bGCSections(false),
|
|
m_bPrintGCSections(false),
|
|
m_bGenUnwindInfo(true),
|
|
m_bPrintICFSections(false),
|
|
m_ICF(ICF::None),
|
|
m_ICFIterations(2),
|
|
m_StripSymbols(StripSymbolMode::KeepAllSymbols),
|
|
m_HashStyle(HashStyle::SystemV) {
|
|
}
|
|
|
|
GeneralOptions::~GeneralOptions() {
|
|
}
|
|
|
|
void GeneralOptions::setSOName(const std::string& pName) {
|
|
size_t pos = pName.find_last_of(sys::fs::separator);
|
|
if (std::string::npos == pos)
|
|
m_SOName = pName;
|
|
else
|
|
m_SOName = pName.substr(pos + 1);
|
|
}
|
|
|
|
void GeneralOptions::addZOption(const ZOption& pOption) {
|
|
switch (pOption.kind()) {
|
|
case ZOption::CombReloc:
|
|
m_bCombReloc = true;
|
|
break;
|
|
case ZOption::NoCombReloc:
|
|
m_bCombReloc = false;
|
|
break;
|
|
case ZOption::Defs:
|
|
m_NoUndefined = YES;
|
|
break;
|
|
case ZOption::ExecStack:
|
|
m_ExecStack = YES;
|
|
break;
|
|
case ZOption::NoExecStack:
|
|
m_ExecStack = NO;
|
|
break;
|
|
case ZOption::InitFirst:
|
|
m_bInitFirst = true;
|
|
break;
|
|
case ZOption::InterPose:
|
|
m_bInterPose = true;
|
|
break;
|
|
case ZOption::LoadFltr:
|
|
m_bLoadFltr = true;
|
|
break;
|
|
case ZOption::MulDefs:
|
|
m_MulDefs = YES;
|
|
break;
|
|
case ZOption::NoCopyReloc:
|
|
m_bNoCopyReloc = true;
|
|
break;
|
|
case ZOption::NoDefaultLib:
|
|
m_bNoDefaultLib = true;
|
|
break;
|
|
case ZOption::NoDelete:
|
|
m_bNoDelete = true;
|
|
break;
|
|
case ZOption::NoDLOpen:
|
|
m_bNoDLOpen = true;
|
|
break;
|
|
case ZOption::NoDump:
|
|
m_bNoDump = true;
|
|
break;
|
|
case ZOption::NoRelro:
|
|
m_bRelro = false;
|
|
break;
|
|
case ZOption::Relro:
|
|
m_bRelro = true;
|
|
break;
|
|
case ZOption::Lazy:
|
|
m_bNow = false;
|
|
break;
|
|
case ZOption::Now:
|
|
m_bNow = true;
|
|
break;
|
|
case ZOption::Origin:
|
|
m_bOrigin = true;
|
|
break;
|
|
case ZOption::CommPageSize:
|
|
m_CommPageSize = pOption.pageSize();
|
|
break;
|
|
case ZOption::MaxPageSize:
|
|
m_MaxPageSize = pOption.pageSize();
|
|
break;
|
|
case ZOption::Unknown:
|
|
default:
|
|
assert(false && "Not a recognized -z option.");
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool GeneralOptions::isInExcludeLIBS(const Input& pInput) const {
|
|
assert(pInput.type() == Input::Archive);
|
|
|
|
if (m_ExcludeLIBS.empty()) {
|
|
return false;
|
|
}
|
|
|
|
// Specifying "--exclude-libs ALL" excludes symbols in all archive libraries
|
|
// from automatic export.
|
|
if (m_ExcludeLIBS.count("ALL") != 0) {
|
|
return true;
|
|
}
|
|
|
|
std::string name(pInput.name());
|
|
name.append(".a");
|
|
if (m_ExcludeLIBS.count(name) != 0) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
} // namespace mcld
|