-/*
- * ObjectFile.cpp
- *
- * Created on: Sep 15, 2012
- * Author: holy
- */
-
#include "ObjectFile.h"
+#include <stdexcept>
+
+using std::runtime_error;
+
+
namespace loader {
ObjectFileHeader::ObjectFileHeader()
, exportsEnd(0)
, externalsBegin(0)
, externalsEnd(0)
-, exportStringsBegin(0)
-, exportStringsEnd(0)
-, externalStringsBegin(0)
-, externalStringsEnd(0)
-, imagesBegin(0)
-, imagesEnd(0)
, objectsBegin(0)
-, objectsEnd(0) {
+, objectsEnd(0)
+, arraysBegin(0)
+, arraysEnd(0) {
ident[0] = 'L';
ident[1] = '2';
ident[2] = 'E';
ident[3] = '\n';
}
-LoadedObjectFile::LoadedObjectFile()
-: allocPtr(0)
-, fileHeader(0)
-, typeOffsetsBegin(0)
-, typeOffsetsEnd(0)
-, exportsBegin(0)
-, exportsEnd(0)
-, externalsBegin(0)
-, externalsEnd(0)
-, exportStringsBegin(0)
-, exportStringsEnd(0)
-, externalStringsBegin(0)
-, externalStringsEnd(0)
-, imagesBegin(0)
-, imagesEnd(0)
-, objectsBegin(0)
-, objectsEnd(0)
-, surfaces(0)
-, surfaceCount(0) {
+void ObjectFileHeader::IntegrityCheck(unsigned int fsize) const {
+ if (ident[0] != 'L'
+ || ident[1] != '2'
+ || ident[2] != 'E'
+ || ident[3] != '\n') {
+ throw runtime_error("magic bytes mismatch");
+ }
+ if (versionId != FORMAT_ID) {
+ throw runtime_error("format ID mismatch");
+ }
+ if (exportsBegin < sizeof(ObjectFileHeader)
+ || exportsBegin > fsize) {
+ throw runtime_error("exports section out of bounds");
+ }
+ if (exportsEnd < exportsBegin
+ || exportsEnd > fsize
+ || (exportsEnd - exportsBegin) % sizeof(Export) != 0) {
+ throw runtime_error("bogus exports section end");
+ }
+ if (externalsBegin < sizeof(ObjectFileHeader)
+ || externalsBegin >= fsize) {
+ throw runtime_error("externals section out of bounds");
+ }
+ if (externalsEnd < externalsBegin
+ || externalsEnd > fsize
+ || (externalsEnd - externalsBegin) % sizeof(External) != 0) {
+ throw runtime_error("bogus externals section end");
+ }
+ if (objectsBegin < sizeof(ObjectFileHeader)
+ || objectsBegin >= fsize
+ || objectsEnd < objectsBegin
+ || objectsEnd > fsize) {
+ throw runtime_error("objects section out of bounds");
+ }
+ if (arraysBegin < sizeof(ObjectFileHeader)
+ || arraysBegin >= fsize
+ || arraysEnd < arraysBegin
+ || arraysEnd > fsize) {
+ throw runtime_error("arrays section out of bounds");
+ }
+}
+
+Export *ObjectFileHeader::ExportsBegin() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Export *>(data + exportsBegin);
+}
+
+Export *ObjectFileHeader::ExportsEnd() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Export *>(data + exportsEnd);
+}
+
+External *ObjectFileHeader::ExternalsBegin() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<External *>(data + externalsBegin);
+}
+
+External *ObjectFileHeader::ExternalsEnd() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<External *>(data + externalsEnd);
+}
+
+Object *ObjectFileHeader::ObjectsBegin() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Object *>(data + objectsBegin);
+}
+
+Object *ObjectFileHeader::ObjectsEnd() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Object *>(data + objectsEnd);
+}
+
+Array *ObjectFileHeader::ArraysBegin() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Array *>(data + arraysBegin);
+}
+
+Array *ObjectFileHeader::ArraysEnd() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Array *>(data + arraysEnd);
+}
+
+
+char *Object::RawObject() {
+ return reinterpret_cast<char *>(this) + sizeof(Object);
+}
+
+Object *Object::Next() {
+ return reinterpret_cast<Object *>(RawObject() + size);
+}
+
+
+char *Array::Data() {
+ return reinterpret_cast<char *>(this) + sizeof(Array);
+}
+Array *Array::Next() {
+ return reinterpret_cast<Array *>(Data() + size);
}
}