//===- LDFileFormat.h -----------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LDFILE_FORMAT_H
#define MCLD_LDFILE_FORMAT_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <cstdio>
#include <cassert>
namespace mcld
{
class MCLinker;
class LDSection;
/** \class LDFileFormat
* \brief LDFileFormat describes the common file formats.
*/
class LDFileFormat
{
public:
enum Kind {
Null,
Regular,
BSS,
NamePool,
Relocation,
Debug,
Target,
EhFrame,
EhFrameHdr,
GCCExceptTable,
Version,
Note,
MetaData,
Group,
};
protected:
LDFileFormat();
public:
virtual ~LDFileFormat();
/// initStdSections - initialize all standard sections.
void initStdSections(MCLinker& pLinker);
/// initObjectFormat - different format, such as ELF and MachO, should
/// implement this
virtual void initObjectFormat(MCLinker& pLinker) = 0;
/// initObjectType - different types, such as shared object, executable
/// files, should implement this
virtual void initObjectType(MCLinker& pLinker) = 0;
// ----- access functions ----- //
LDSection& getText() {
assert(NULL != f_pTextSection);
return *f_pTextSection;
}
const LDSection& getText() const {
assert(NULL != f_pTextSection);
return *f_pTextSection;
}
LDSection& getData() {
assert(NULL != f_pDataSection);
return *f_pDataSection;
}
const LDSection& getData() const {
assert(NULL != f_pDataSection);
return *f_pDataSection;
}
LDSection& getBSS() {
assert(NULL != f_pBSSSection);
return *f_pBSSSection;
}
const LDSection& getBSS() const {
assert(NULL != f_pBSSSection);
return *f_pBSSSection;
}
LDSection& getReadOnly() {
assert(NULL != f_pReadOnlySection);
return *f_pReadOnlySection;
}
const LDSection& getReadOnly() const {
assert(NULL != f_pReadOnlySection);
return *f_pReadOnlySection;
}
protected:
// variable name : ELF MachO
LDSection* f_pTextSection; // .text __text
LDSection* f_pDataSection; // .data __data
LDSection* f_pBSSSection; // .bss __bss
LDSection* f_pReadOnlySection; // .rodata __const
};
} // namespace of mcld
#endif