blob: 415bdc8cce216e1cf90ea7e61f694cce2812075f [file] [log] [blame]
//===- 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(ArgFilterAlias));
// } 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;
}