//===- FragmentLinker.h ---------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file provides a number of APIs used by SectLinker.
// These APIs do the things which a linker should do.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_FRAGMENT_FRAGMENT_LINKER_H
#define MCLD_FRAGMENT_FRAGMENT_LINKER_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <string>
#include <mcld/LinkerConfig.h>
#include <mcld/LD/LDFileFormat.h>
#include <mcld/LD/LDSymbol.h>
#include <mcld/Fragment/Relocation.h>
#include <mcld/MC/MCLDInput.h>
namespace mcld {
class Module;
class TargetLDBackend;
class LinkerConfig;
class MemoryArea;
/** \class FragmentLinker
* \brief FragmentLinker provides a pass to link object files.
*/
class FragmentLinker
{
public:
FragmentLinker(const LinkerConfig& pConfig,
Module& pModule,
TargetLDBackend& pBackend);
~FragmentLinker();
bool finalizeSymbols();
/// applyRelocations - apply all relocation enties.
bool applyRelocations();
/// syncRelocationResult - After applying relocation, write back relocation target
/// data to output file.
void syncRelocationResult(MemoryArea& pOutput);
private:
/// normalSyncRelocationResult - sync relocation result when producing shared
/// objects or executables
void normalSyncRelocationResult(MemoryArea& pOutput);
/// partialSyncRelocationResult - sync relocation result when doing partial
/// link
void partialSyncRelocationResult(MemoryArea& pOutput);
/// writeRelocationResult - helper function of syncRelocationResult, write
/// relocation target data to output
void writeRelocationResult(Relocation& pReloc, uint8_t* pOutput);
private:
const LinkerConfig& m_Config;
Module& m_Module;
TargetLDBackend& m_Backend;
};
} // namespace of mcld
#endif