122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- GeneralOptions.cpp -------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/GeneralOptions.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/Input.h" 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/ZOption.h" 120dea6bc96bb52346737966839ac68644f7939f58Stephen Hines#include <cassert> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// GeneralOptions 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 19affc150dc44fab1911775a49636d0ce85333b634Zonr ChangGeneralOptions::GeneralOptions() 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines : m_Verbose(-1), 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_MaxErrorNum(-1), 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_MaxWarnNum(-1), 232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar m_NumSpareDTags(5), 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_ExecStack(Unknown), 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_NoUndefined(Unknown), 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_MulDefs(Unknown), 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_CommPageSize(0x0), 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_MaxPageSize(0x0), 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bCombReloc(true), 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bInitFirst(false), 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bInterPose(false), 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bLoadFltr(false), 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNoCopyReloc(false), 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNoDefaultLib(false), 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNoDelete(false), 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNoDLOpen(false), 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNoDump(false), 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bRelro(false), 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNow(false), 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bOrigin(false), 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bTrace(false), 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Bsymbolic(false), 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Bgroup(false), 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bPIE(false), 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bColor(true), 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bCreateEhFrameHdr(false), 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNMagic(false), 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bOMagic(false), 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bStripDebug(false), 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bExportDynamic(false), 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bWarnSharedTextrel(false), 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bBinaryInput(false), 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bDefineCommon(false), 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bFatalWarnings(false), 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNewDTags(false), 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bNoStdlib(false), 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bWarnMismatch(true), 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bGCSections(false), 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bPrintGCSections(false), 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bGenUnwindInfo(true), 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bPrintICFSections(false), 622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar m_ICF(ICF::None), 632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar m_ICFIterations(2), 642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar m_StripSymbols(StripSymbolMode::KeepAllSymbols), 652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar m_HashStyle(HashStyle::SystemV) { 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6837b74a387bb3993387029859c2d9d051c41c724eStephen HinesGeneralOptions::~GeneralOptions() { 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid GeneralOptions::setSOName(const std::string& pName) { 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t pos = pName.find_last_of(sys::fs::separator); 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (std::string::npos == pos) 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_SOName = pName; 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_SOName = pName.substr(pos + 1); 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid GeneralOptions::addZOption(const ZOption& pOption) { 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang switch (pOption.kind()) { 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::CombReloc: 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bCombReloc = true; 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoCombReloc: 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bCombReloc = false; 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::Defs: 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_NoUndefined = YES; 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::ExecStack: 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_ExecStack = YES; 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoExecStack: 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_ExecStack = NO; 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::InitFirst: 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bInitFirst = true; 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::InterPose: 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bInterPose = true; 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::LoadFltr: 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bLoadFltr = true; 104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::MulDefs: 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_MulDefs = YES; 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoCopyReloc: 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bNoCopyReloc = true; 110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoDefaultLib: 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bNoDefaultLib = true; 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoDelete: 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bNoDelete = true; 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoDLOpen: 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bNoDLOpen = true; 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoDump: 121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bNoDump = true; 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::NoRelro: 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bRelro = false; 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::Relro: 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bRelro = true; 128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::Lazy: 130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bNow = false; 131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::Now: 133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bNow = true; 134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::Origin: 136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_bOrigin = true; 137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::CommPageSize: 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_CommPageSize = pOption.pageSize(); 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::MaxPageSize: 142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_MaxPageSize = pOption.pageSize(); 143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang case ZOption::Unknown: 145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang default: 146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang assert(false && "Not a recognized -z option."); 147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 1500dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 15137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool GeneralOptions::isInExcludeLIBS(const Input& pInput) const { 1520dea6bc96bb52346737966839ac68644f7939f58Stephen Hines assert(pInput.type() == Input::Archive); 1530dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 1540dea6bc96bb52346737966839ac68644f7939f58Stephen Hines if (m_ExcludeLIBS.empty()) { 1550dea6bc96bb52346737966839ac68644f7939f58Stephen Hines return false; 1560dea6bc96bb52346737966839ac68644f7939f58Stephen Hines } 1570dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 1580dea6bc96bb52346737966839ac68644f7939f58Stephen Hines // Specifying "--exclude-libs ALL" excludes symbols in all archive libraries 1590dea6bc96bb52346737966839ac68644f7939f58Stephen Hines // from automatic export. 1600dea6bc96bb52346737966839ac68644f7939f58Stephen Hines if (m_ExcludeLIBS.count("ALL") != 0) { 1610dea6bc96bb52346737966839ac68644f7939f58Stephen Hines return true; 1620dea6bc96bb52346737966839ac68644f7939f58Stephen Hines } 1630dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 1640dea6bc96bb52346737966839ac68644f7939f58Stephen Hines std::string name(pInput.name()); 1650dea6bc96bb52346737966839ac68644f7939f58Stephen Hines name.append(".a"); 1660dea6bc96bb52346737966839ac68644f7939f58Stephen Hines if (m_ExcludeLIBS.count(name) != 0) { 1670dea6bc96bb52346737966839ac68644f7939f58Stephen Hines return true; 1680dea6bc96bb52346737966839ac68644f7939f58Stephen Hines } 1690dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 1700dea6bc96bb52346737966839ac68644f7939f58Stephen Hines return false; 1710dea6bc96bb52346737966839ac68644f7939f58Stephen Hines} 17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 174