opaque_section_file.cpp [plain text]
#include <vector>
#include <map>
#include "ld.hpp"
#include "opaque_section_file.h"
namespace opaque_section {
class Atom : public ld::Atom {
public:
virtual ld::File* file() const { return (ld::File*)&_file; }
virtual const char* name() const { return _name; }
virtual uint64_t size() const { return _size; }
virtual uint64_t objectAddress() const { return 0; }
virtual void copyRawContent(uint8_t buffer[]) const
{ memcpy(buffer, _content, _size); }
virtual void setScope(Scope) { }
protected:
friend class File;
Atom(class File& f, const char* n, const uint8_t* content, uint64_t sz);
virtual ~Atom() {}
class File& _file;
const char* _name;
const uint8_t* _content;
uint64_t _size;
};
class File : public ld::File
{
public:
File(const char* segmentName, const char* sectionName, const char* pth,
const uint8_t fileContent[], uint64_t fileLength,
const char* symbolName="sect_create")
: ld::File(pth, 0, ld::File::Ordinal::NullOrdinal(), Other),
_atom(*this, symbolName, fileContent, fileLength),
_section(segmentName, sectionName, ld::Section::typeSectCreate) { }
virtual ~File() { }
virtual bool forEachAtom(ld::File::AtomHandler& h) const { h.doAtom(_atom); return true; }
virtual bool justInTimeforEachAtom(const char* name, ld::File::AtomHandler&) const { return false; }
ld::Atom* atom() { return &_atom; }
private:
friend class Atom;
Atom _atom;
ld::Section _section;
};
Atom::Atom(File& f, const char* n, const uint8_t* content, uint64_t sz)
: ld::Atom(f._section, ld::Atom::definitionRegular, ld::Atom::combineNever,
ld::Atom::scopeTranslationUnit, ld::Atom::typeUnclassified,
symbolTableNotIn, true, false, false, ld::Atom::Alignment(0)),
_file(f), _name(n), _content(content), _size(sz) {}
ld::File* parse(const char* segmentName, const char* sectionName, const char* path,
const uint8_t fileContent[], uint64_t fileLength,
const char* symbolName)
{
return new File(segmentName, sectionName, path, fileContent, fileLength, symbolName);
}
}