//===- Relocator.cpp ------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include <mcld/Fragment/Fragment.h> #include <mcld/LD/LDSymbol.h> #include <mcld/LD/Relocator.h> #include <mcld/LD/ResolveInfo.h> #include <mcld/LD/SectionData.h> #include <mcld/Module.h> using namespace mcld; //===----------------------------------------------------------------------===// // Relocator //===----------------------------------------------------------------------===// Relocator::~Relocator() { } void Relocator::partialScanRelocation(Relocation& pReloc, Module& pModule, const LDSection& pSection) { // if we meet a section symbol if (pReloc.symInfo()->type() == ResolveInfo::Section) { LDSymbol* input_sym = pReloc.symInfo()->outSymbol(); // 1. update the relocation target offset assert(input_sym->hasFragRef()); uint64_t offset = input_sym->fragRef()->getOutputOffset(); pReloc.target() += offset; // 2. get output section symbol // get the output LDSection which the symbol defined in const LDSection& out_sect = input_sym->fragRef()->frag()->getParent()->getSection(); ResolveInfo* sym_info = pModule.getSectionSymbolSet().get(out_sect)->resolveInfo(); // set relocation target symbol to the output section symbol's resolveInfo pReloc.setSymInfo(sym_info); } }