Home | History | Annotate | Download | only in Core
      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 
     14 namespace mcld {
     15 
     16 //===----------------------------------------------------------------------===//
     17 // GeneralOptions
     18 //===----------------------------------------------------------------------===//
     19 GeneralOptions::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_StripSymbols(StripSymbolMode::KeepAllSymbols),
     65       m_HashStyle(HashStyle::SystemV) {
     66 }
     67 
     68 GeneralOptions::~GeneralOptions() {
     69 }
     70 
     71 void GeneralOptions::setSOName(const std::string& pName) {
     72   size_t pos = pName.find_last_of(sys::fs::separator);
     73   if (std::string::npos == pos)
     74     m_SOName = pName;
     75   else
     76     m_SOName = pName.substr(pos + 1);
     77 }
     78 
     79 void GeneralOptions::addZOption(const ZOption& pOption) {
     80   switch (pOption.kind()) {
     81     case ZOption::CombReloc:
     82       m_bCombReloc = true;
     83       break;
     84     case ZOption::NoCombReloc:
     85       m_bCombReloc = false;
     86       break;
     87     case ZOption::Defs:
     88       m_NoUndefined = YES;
     89       break;
     90     case ZOption::ExecStack:
     91       m_ExecStack = YES;
     92       break;
     93     case ZOption::NoExecStack:
     94       m_ExecStack = NO;
     95       break;
     96     case ZOption::InitFirst:
     97       m_bInitFirst = true;
     98       break;
     99     case ZOption::InterPose:
    100       m_bInterPose = true;
    101       break;
    102     case ZOption::LoadFltr:
    103       m_bLoadFltr = true;
    104       break;
    105     case ZOption::MulDefs:
    106       m_MulDefs = YES;
    107       break;
    108     case ZOption::NoCopyReloc:
    109       m_bNoCopyReloc = true;
    110       break;
    111     case ZOption::NoDefaultLib:
    112       m_bNoDefaultLib = true;
    113       break;
    114     case ZOption::NoDelete:
    115       m_bNoDelete = true;
    116       break;
    117     case ZOption::NoDLOpen:
    118       m_bNoDLOpen = true;
    119       break;
    120     case ZOption::NoDump:
    121       m_bNoDump = true;
    122       break;
    123     case ZOption::NoRelro:
    124       m_bRelro = false;
    125       break;
    126     case ZOption::Relro:
    127       m_bRelro = true;
    128       break;
    129     case ZOption::Lazy:
    130       m_bNow = false;
    131       break;
    132     case ZOption::Now:
    133       m_bNow = true;
    134       break;
    135     case ZOption::Origin:
    136       m_bOrigin = true;
    137       break;
    138     case ZOption::CommPageSize:
    139       m_CommPageSize = pOption.pageSize();
    140       break;
    141     case ZOption::MaxPageSize:
    142       m_MaxPageSize = pOption.pageSize();
    143       break;
    144     case ZOption::Unknown:
    145     default:
    146       assert(false && "Not a recognized -z option.");
    147       break;
    148   }
    149 }
    150 
    151 bool GeneralOptions::isInExcludeLIBS(const Input& pInput) const {
    152   assert(pInput.type() == Input::Archive);
    153 
    154   if (m_ExcludeLIBS.empty()) {
    155     return false;
    156   }
    157 
    158   // Specifying "--exclude-libs ALL" excludes symbols in all archive libraries
    159   // from automatic export.
    160   if (m_ExcludeLIBS.count("ALL") != 0) {
    161     return true;
    162   }
    163 
    164   std::string name(pInput.name());
    165   name.append(".a");
    166   if (m_ExcludeLIBS.count(name) != 0) {
    167     return true;
    168   }
    169 
    170   return false;
    171 }
    172 
    173 }  // namespace mcld
    174