+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 (!CheckSection(exportsBegin, exportsEnd, fsize)) {
+ throw runtime_error("exports section out of bounds");
+ }
+ if ((exportsEnd - exportsBegin) % sizeof(Export) != 0) {
+ throw runtime_error("bogus exports section end");
+ }
+ if (!CheckSection(externalsBegin, externalsEnd, fsize)) {
+ throw runtime_error("externals section out of bounds");
+ }
+ if ((externalsEnd - externalsBegin) % sizeof(External) != 0) {
+ throw runtime_error("bogus externals section end");
+ }
+ if (!CheckSection(imagesBegin, imagesEnd, fsize)) {
+ throw runtime_error("images section out of bounds");
+ }
+ if ((imagesEnd - imagesBegin) % sizeof(Image) != 0) {
+ throw runtime_error("bogus images section end");
+ }
+ if (!CheckSection(objectsBegin, objectsEnd, fsize)) {
+ throw runtime_error("objects section out of bounds");
+ }
+ if (!CheckSection(arraysBegin, arraysEnd, fsize)) {
+ throw runtime_error("arrays section out of bounds");
+ }
+}
+
+bool ObjectFileHeader::CheckSection(
+ unsigned int begin,
+ unsigned int end,
+ unsigned int fsize) const {
+ return begin >= sizeof(ObjectFileHeader)
+ && begin < fsize
+ && end >= begin
+ && end <= fsize;
+}
+
+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);
+}
+
+Image *ObjectFileHeader::ImagesBegin() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Image *>(data + imagesBegin);
+}
+
+Image *ObjectFileHeader::ImagesEnd() {
+ char *data = reinterpret_cast<char *>(this);
+ return reinterpret_cast<Image *>(data + imagesEnd);
+}
+
+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);
+}