| //===- DynamicSectionOptions.cpp ------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <mcld/DynamicSectionOptions.h> |
| #include <mcld/LinkerConfig.h> |
| #include <mcld/LinkerScript.h> |
| #include <mcld/MC/ZOption.h> |
| |
| namespace { |
| |
| llvm::cl::opt<std::string> ArgEntry("e", |
| llvm::cl::desc("Use the explicit symbol as the entrance of your program."), |
| llvm::cl::value_desc("entry"), |
| llvm::cl::ValueRequired); |
| |
| llvm::cl::alias ArgEntryAlias("entry", |
| llvm::cl::desc("alias for -e"), |
| llvm::cl::aliasopt(ArgEntry)); |
| |
| llvm::cl::opt<bool> ArgBsymbolic("Bsymbolic", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("Bind references within the shared library."), |
| llvm::cl::init(false)); |
| |
| llvm::cl::opt<bool> ArgBgroup("Bgroup", |
| llvm::cl::desc("Info the dynamic linker to lookups only inside the group."), |
| llvm::cl::init(false)); |
| |
| llvm::cl::opt<std::string> ArgSOName("soname", |
| llvm::cl::desc("Set internal name of shared library"), |
| llvm::cl::value_desc("name")); |
| |
| llvm::cl::opt<llvm::cl::boolOrDefault> ArgNoUndefined("no-undefined", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("Do not allow unresolved references")); |
| |
| llvm::cl::opt<llvm::cl::boolOrDefault> ArgAllowMulDefs("allow-multiple-definition", |
| llvm::cl::desc("Allow multiple definition")); |
| |
| llvm::cl::list<mcld::ZOption, |
| bool, |
| llvm::cl::parser<mcld::ZOption> > ArgZOptionList("z", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("The -z options for GNU ld compatibility."), |
| llvm::cl::value_desc("keyword"), |
| llvm::cl::Prefix); |
| |
| llvm::cl::opt<std::string> ArgDyld("dynamic-linker", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("Set the name of the dynamic linker."), |
| llvm::cl::value_desc("Program")); |
| |
| llvm::cl::opt<bool> ArgEnableNewDTags("enable-new-dtags", |
| llvm::cl::desc("Enable use of DT_RUNPATH and DT_FLAGS"), |
| llvm::cl::init(false)); |
| |
| // Not supported yet { |
| llvm::cl::list<std::string> ArgAuxiliary("f", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("Auxiliary filter for shared object symbol table"), |
| llvm::cl::value_desc("name")); |
| |
| llvm::cl::alias ArgAuxiliaryAlias("auxiliary", |
| llvm::cl::desc("alias for -f"), |
| llvm::cl::aliasopt(ArgAuxiliary)); |
| |
| llvm::cl::opt<std::string> ArgFilter("F", |
| llvm::cl::desc("Filter for shared object symbol table"), |
| llvm::cl::value_desc("name")); |
| |
| llvm::cl::alias ArgFilterAlias("filter", |
| llvm::cl::desc("alias for -F"), |
| llvm::cl::aliasopt(ArgFilter)); |
| |
| // } Not supported yet |
| |
| } // anonymous namespace |
| |
| using namespace mcld; |
| |
| //===----------------------------------------------------------------------===// |
| // DynamicSectionOptions |
| //===----------------------------------------------------------------------===// |
| DynamicSectionOptions::DynamicSectionOptions() |
| : m_Entry(ArgEntry), |
| m_Bsymbolic(ArgBsymbolic), |
| m_Bgroup(ArgBgroup), |
| m_SOName(ArgSOName), |
| m_NoUndefined(ArgNoUndefined), |
| m_AllowMulDefs(ArgAllowMulDefs), |
| m_ZOptionList(ArgZOptionList), |
| m_Dyld(ArgDyld), |
| m_EnableNewDTags(ArgEnableNewDTags), |
| m_Auxiliary(ArgAuxiliary), |
| m_Filter(ArgFilter) { |
| } |
| |
| bool DynamicSectionOptions::parse(LinkerConfig& pConfig, LinkerScript& pScript) |
| { |
| // set up entry point from -e |
| pScript.setEntry(m_Entry); |
| |
| // --Bsymbolic |
| pConfig.options().setBsymbolic(m_Bsymbolic); |
| |
| // --Bgroup |
| pConfig.options().setBgroup(m_Bgroup); |
| |
| // set --soname [soname] |
| pConfig.options().setSOName(m_SOName); |
| |
| // set -z options |
| llvm::cl::list<ZOption>::iterator zOpt; |
| llvm::cl::list<ZOption>::iterator zOptEnd = m_ZOptionList.end(); |
| for (zOpt = m_ZOptionList.begin(); zOpt != zOptEnd; ++zOpt) { |
| pConfig.options().addZOption(*zOpt); |
| } |
| |
| // set --no-undefined |
| if (llvm::cl::BOU_UNSET != m_NoUndefined) |
| pConfig.options().setNoUndefined(llvm::cl::BOU_TRUE == m_NoUndefined); |
| |
| // set --allow-multiple-definition |
| if (llvm::cl::BOU_UNSET != m_AllowMulDefs) |
| pConfig.options().setMulDefs(llvm::cl::BOU_TRUE == m_AllowMulDefs); |
| |
| // set --dynamic-linker [dyld] |
| pConfig.options().setDyld(m_Dyld); |
| |
| // set --enable-new-dtags |
| pConfig.options().setNewDTags(m_EnableNewDTags); |
| |
| // set --auxiliary, -f |
| llvm::cl::list<std::string>::iterator aux; |
| llvm::cl::list<std::string>::iterator auxEnd = m_Auxiliary.end(); |
| for (aux = m_Auxiliary.begin(); aux != auxEnd; ++aux) |
| pConfig.options().getAuxiliaryList().push_back(*aux); |
| |
| // set --filter, -F |
| pConfig.options().setFilter(m_Filter); |
| |
| return true; |
| } |
| |