193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao/* 293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * Copyright 2012, The Android Open Source Project 393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * 493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * you may not use this file except in compliance with the License. 693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * You may obtain a copy of the License at 793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * 893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * 1093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * Unless required by applicable law or agreed to in writing, software 1193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 1293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * See the License for the specific language governing permissions and 1493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * limitations under the License. 1593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao */ 1693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 1793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include "bcc/Support/LinkerConfig.h" 1893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include "bcc/Support/Log.h" 1993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 2093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <llvm/Support/Signals.h> 2193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 2252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao#include <mcld/LinkerConfig.h> 2393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/MC/MCLDDirectory.h> 24f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao#include <mcld/MC/ZOption.h> 2593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/LD/TextDiagnosticPrinter.h> 2693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/Path.h> 2793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/MsgHandling.h> 2893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/raw_ostream.h> 2993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 3093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaousing namespace bcc; 3193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 3293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei LiaoLinkerConfig::LinkerConfig(const std::string &pTriple) 3352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao : mTriple(pTriple), mSOName(), mTarget(NULL), mLDConfig(NULL), 3493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mDiagLineInfo(NULL), mDiagPrinter(NULL) { 3593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 3693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao initializeTarget(); 3793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao initializeLDInfo(); 3893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao initializeDiagnostic(); 3993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 4093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 4193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei LiaoLinkerConfig::~LinkerConfig() { 4252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao delete mLDConfig; 4393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 4493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao if (mDiagPrinter->getNumErrors() != 0) { 4593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // If here, the program failed ungracefully. Run the interrupt handlers to 4693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // ensure any other cleanups (e.g., files that registered by 4793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // RemoveFileOnSignal(...)) getting done before exit. 4893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao llvm::sys::RunInterruptHandlers(); 4993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } 5093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mDiagPrinter->finish(); 5193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 5293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao delete mDiagLineInfo; 5393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao delete mDiagPrinter; 5493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 5593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 5693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaobool LinkerConfig::initializeTarget() { 5793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao std::string error; 5893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mTarget = mcld::TargetRegistry::lookupTarget(mTriple, error); 5993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao if (NULL != mTarget) { 6093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return true; 6193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } else { 6293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao ALOGE("Cannot initialize mcld::Target for given triple '%s'! (%s)\n", 6393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mTriple.c_str(), error.c_str()); 6493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return false; 6593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } 6693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 6793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 6893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaobool LinkerConfig::initializeLDInfo() { 6952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao if (NULL != mLDConfig) { 7093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao ALOGE("Cannot initialize mcld::MCLDInfo for given triple '%s!\n", 7193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mTriple.c_str()); 7293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return false; 7393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } 7493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 7552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig = new mcld::LinkerConfig(getTriple()); 7652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->setCodeGenType(mcld::LinkerConfig::Exec); 7752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao 7852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao struct NameMap { 7952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao const char* from; 8052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao const char* to; 8152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao }; 8252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao 8352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao static const NameMap map[] = 8452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao { 8552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".text", ".text"}, 8652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".rodata", ".rodata"}, 8752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".data.rel.ro.local", ".data.rel.ro.local"}, 8852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".data.rel.ro", ".data.rel.ro"}, 8952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".data", ".data"}, 9052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".bss", ".bss"}, 9152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".tdata", ".tdata"}, 9252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".tbss", ".tbss"}, 9352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".init_array", ".init_array"}, 9452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".fini_array", ".fini_array"}, 9552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao // TODO: Support DT_INIT_ARRAY for all constructors? 9652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".ctors", ".ctors"}, 9752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".dtors", ".dtors"}, 9852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao // FIXME: in GNU ld, if we are creating a shared object .sdata2 and .sbss2 9952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao // sections would be handled differently. 10052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".sdata2", ".sdata"}, 10152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".sbss2", ".sbss"}, 10252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".sdata", ".sdata"}, 10352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".sbss", ".sbss"}, 10452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".lrodata", ".lrodata"}, 10552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".ldata", ".ldata"}, 10652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".lbss", ".lbss"}, 10752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gcc_except_table", ".gcc_except_table"}, 10852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.d.rel.ro.local", ".data.rel.ro.local"}, 10952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.d.rel.ro", ".data.rel.ro"}, 11052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.r", ".rodata"}, 11152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.d", ".data"}, 11252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.b", ".bss"}, 11352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.sb2", ".sbss"}, 11452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.sb", ".sbss"}, 11552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.s2", ".sdata"}, 11652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.s", ".sdata"}, 11752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.wi", ".debug_info"}, 11852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.td", ".tdata"}, 11952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.tb", ".tbss"}, 12052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.t", ".text"}, 12152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.lr", ".lrodata"}, 12252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.lb", ".lbss"}, 12352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao {".gnu.linkonce.l", ".ldata"}, 12452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao }; 12552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao 12652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao if (mLDConfig->codeGenType() != mcld::LinkerConfig::Object) { 12752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao const unsigned int map_size = (sizeof(map) / sizeof(map[0]) ); 12852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao for (unsigned int i = 0; i < map_size; ++i) { 12952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao bool exist = false; 13052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->scripts().sectionMap().append(map[i].from, 13152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao map[i].to, 13252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao exist); 13352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao } 13452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao } 13593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return true; 13693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 13793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 13893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaobool LinkerConfig::initializeDiagnostic() { 13993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // Set up MsgHandler. 14052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mDiagPrinter = new mcld::TextDiagnosticPrinter(mcld::errs(), *mLDConfig); 14193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 14252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mcld::InitializeDiagnosticEngine(*mLDConfig, mDiagPrinter); 14393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 14452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mDiagLineInfo = mTarget->createDiagnosticLineInfo(*mTarget, mTriple); 14593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 14652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mcld::getDiagnosticEngine().setLineInfo(*mDiagLineInfo); 14793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return true; 14893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 14993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 15052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liaobool LinkerConfig::isShared() const { 15152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao return (mcld::LinkerConfig::DynObj == mLDConfig->codeGenType()); 15252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao} 15352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao 15493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setShared(bool pEnable) { 15552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao if (pEnable) 15652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->setCodeGenType(mcld::LinkerConfig::DynObj); 15752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao else 15852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->setCodeGenType(mcld::LinkerConfig::Exec); 15993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return; 16093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 16193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 16293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setBsymbolic(bool pEnable) { 16352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().setBsymbolic(pEnable); 16493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return; 16593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 16693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 167ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liaovoid LinkerConfig::setDefineCommon(bool pEnable) { 168ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao mLDConfig->options().setDefineCommon(pEnable); 169ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao return; 170ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao} 171ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao 17293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setSOName(const std::string &pSOName) { 17352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().setSOName(pSOName); 17493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return; 17593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 17693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 17793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setDyld(const std::string &pDyld) { 17852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().setDyld(pDyld); 17993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return; 18093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 18193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 18293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setSysRoot(const std::string &pSysRoot) { 18352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().setSysroot(mcld::sys::fs::Path(pSysRoot)); 18493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return; 18593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 18693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 187f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liaovoid LinkerConfig::setZOption(unsigned int pOptions) { 188f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao mcld::ZOption option; 189f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kCombReloc) { 190f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::CombReloc); 19152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 192f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 193f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao else { 194f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoCombReloc); 19552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 196f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 197f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 198f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kDefs) { 199f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::Defs); 20052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 201f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 202f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 203f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kExecStack) { 204f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::ExecStack); 20552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 206f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 207f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao else { 208f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoExecStack); 20952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 210f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 211f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 212f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kInitFirst) { 213f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::InitFirst); 21452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 215f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 216f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 217f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kInterPose) { 218f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::InterPose); 21952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 220f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 221f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 222f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kLoadFltr) { 223f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::LoadFltr); 22452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 225f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 226f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 227f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kMulDefs) { 228f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::MulDefs); 22952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 230f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 231f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 232f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kNoCopyReloc) { 233f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoCopyReloc); 23452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 235f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 236f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 237f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kNoDefaultLib) { 238f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoDefaultLib); 23952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 240f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 241f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 242f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kNoDelete) { 243f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoDelete); 24452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 245f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 246f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 247f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kNoDLOpen) { 248f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoDLOpen); 24952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 250f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 251f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 252f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kNoDump) { 253f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoDump); 25452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 255f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 256f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 257f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kRelro) { 258f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::Relro); 25952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 260f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 261f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao else { 262f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::NoRelro); 26352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 264f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 265f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 266f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kLazy) { 267f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::Lazy); 26852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 269f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 270f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao else { 271f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::Now); 27252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 273f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 274f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 275f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao if (pOptions & kOrigin) { 276f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao option.setKind(mcld::ZOption::Origin); 27752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->options().addZOption(option); 278f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao } 279f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao} 280f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao 28193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::addWrap(const std::string &pWrapSymbol) { 28293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao bool exist = false; 28393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 28493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // Add wname -> __wrap_wname. 28593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::StringEntry<llvm::StringRef>* to_wrap = 28652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->scripts().renameMap().insert(pWrapSymbol, exist); 28793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 28893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao std::string to_wrap_str = "__wrap_" + pWrapSymbol; 28993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao to_wrap->setValue(to_wrap_str); 29093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 29193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao if (exist) { 29293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::warning(mcld::diag::rewrap) << pWrapSymbol << to_wrap_str; 29393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } 29493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 29593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // Add __real_wname -> wname. 29693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao std::string from_real_str = "__real_" + pWrapSymbol; 29793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::StringEntry<llvm::StringRef>* from_real = 29852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->scripts().renameMap().insert(from_real_str, exist); 29993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao from_real->setValue(pWrapSymbol); 30093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 30193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao if (exist) { 30293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::warning(mcld::diag::rewrap) << pWrapSymbol << from_real_str; 30393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } 30493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 30593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return; 30693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 30793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 30893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::addPortable(const std::string &pPortableSymbol) { 30993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao bool exist = false; 31093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 31193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // Add pname -> pname_portable. 31293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::StringEntry<llvm::StringRef>* to_port = 31352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->scripts().renameMap().insert(pPortableSymbol, exist); 31493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 31593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao std::string to_port_str = pPortableSymbol + "_portable"; 31693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao to_port->setValue(to_port_str); 31793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 31893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao if (exist) { 31993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::warning(mcld::diag::rewrap) << pPortableSymbol << to_port_str; 32093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 32193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 32293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // Add __real_pname -> pname. 32393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao std::string from_real_str = "__real_" + pPortableSymbol; 32493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::StringEntry<llvm::StringRef>* from_real = 32552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mLDConfig->scripts().renameMap().insert(from_real_str, exist); 32693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 32793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao from_real->setValue(pPortableSymbol); 32893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 32993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao if (exist) { 33093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao mcld::warning(mcld::diag::rewrap) << pPortableSymbol << from_real_str; 33193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } 33293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 33393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao return; 33493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 33593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao 33693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::addSearchDir(const std::string &pDirPath) { 33793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao // SearchDirs will remove the created MCLDDirectory. 33852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao if (!mLDConfig->options().directories().insert(pDirPath)) { 33952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao mcld::warning(mcld::diag::warn_cannot_open_search_dir) << pDirPath; 34093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao } 34193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao} 342