#include <vector>
#include "ObjectFile.h"
namespace SectCreate {
class Segment : public ObjectFile::Segment
{
public:
Segment(const char* name) { fName = name; }
virtual const char* getName() const { return fName; }
virtual bool isContentReadable() const { return true; }
virtual bool isContentWritable() const { return false; }
virtual bool isContentExecutable() const { return false; }
private:
const char* fName;
};
class Reader : public ObjectFile::Reader
{
public:
Reader(const char* segmentName, const char* sectionName, const char* path, const uint8_t fileContent[], uint64_t fileLength);
virtual ~Reader();
virtual const char* getPath() { return fPath; }
virtual time_t getModificationTime() { return 0; }
virtual DebugInfoKind getDebugInfoKind() { return ObjectFile::Reader::kDebugInfoNone; }
virtual std::vector<class ObjectFile::Atom*>& getAtoms() { return fAtoms; }
virtual std::vector<class ObjectFile::Atom*>* getJustInTimeAtomsFor(const char* name) { return NULL; }
virtual std::vector<Stab>* getStabs() { return NULL; }
private:
const char* fPath;
std::vector<class ObjectFile::Atom*> fAtoms;
};
class Atom : public ObjectFile::Atom {
public:
virtual ObjectFile::Reader* getFile() const { return &fOwner; }
virtual bool getTranslationUnitSource(const char** dir, const char** name) const { return false; }
virtual const char* getName() const { return NULL; }
virtual const char* getDisplayName() const;
virtual Scope getScope() const { return ObjectFile::Atom::scopeTranslationUnit; }
virtual DefinitionKind getDefinitionKind() const { return kRegularDefinition; }
virtual SymbolTableInclusion getSymbolTableInclusion() const { return ObjectFile::Atom::kSymbolTableNotIn; }
virtual bool dontDeadStrip() const { return true; }
virtual bool isZeroFill() const { return false; }
virtual uint64_t getSize() const { return fFileLength; }
virtual std::vector<ObjectFile::Reference*>& getReferences() const { return fgEmptyReferenceList; }
virtual bool mustRemainInSection() const { return false; }
virtual const char* getSectionName() const { return fSectionName; }
virtual Segment& getSegment() const { return fSegment; }
virtual bool requiresFollowOnAtom() const{ return false; }
virtual ObjectFile::Atom& getFollowOnAtom() const { return *((ObjectFile::Atom*)NULL); }
virtual std::vector<ObjectFile::LineInfo>* getLineInfo() const { return NULL; }
virtual uint8_t getAlignment() const { return 4; }
virtual void copyRawContent(uint8_t buffer[]) const;
virtual void setScope(Scope) { }
protected:
friend class Reader;
Atom(Reader& owner, Segment& segment, const char* sectionName, const uint8_t fileContent[], uint64_t fileLength)
: fOwner(owner), fSegment(segment), fSectionName(sectionName), fFileContent(fileContent), fFileLength(fileLength) { }
virtual ~Atom() {}
Reader& fOwner;
Segment& fSegment;
const char* fSectionName;
const uint8_t* fFileContent;
uint64_t fFileLength;
static std::vector<ObjectFile::Reference*> fgEmptyReferenceList;
};
std::vector<ObjectFile::Reference*> Atom::fgEmptyReferenceList;
Reader::Reader(const char* segmentName, const char* sectionName, const char* path, const uint8_t fileContent[], uint64_t fileLength)
: fPath(path)
{
fAtoms.push_back(new Atom(*this, *(new Segment(segmentName)), sectionName, fileContent, fileLength));
}
Reader::~Reader()
{
}
const char* Atom::getDisplayName() const
{
static char name[64];
sprintf(name, "-sectcreate %s %s", fSegment.getName(), fSectionName);
return name;
}
void Atom::copyRawContent(uint8_t buffer[]) const
{
memcpy(buffer, fFileContent, fFileLength);
}
Reader* MakeReader(const char* segmentName, const char* sectionName, const char* path, const uint8_t fileContent[], uint64_t fileLength)
{
return new Reader(segmentName, sectionName, path, fileContent, fileLength);
}
};