1 #include "ObjectFile.h"
5 using std::runtime_error;
10 ObjectFileHeader::ObjectFileHeader()
11 : versionId(FORMAT_ID)
26 void ObjectFileHeader::IntegrityCheck(unsigned int fsize) const {
30 || ident[3] != '\n') {
31 throw runtime_error("magic bytes mismatch");
33 if (versionId != FORMAT_ID) {
34 throw runtime_error("format ID mismatch");
36 if (!CheckSection(exportsBegin, exportsEnd, fsize)) {
37 throw runtime_error("exports section out of bounds");
39 if ((exportsEnd - exportsBegin) % sizeof(Export) != 0) {
40 throw runtime_error("bogus exports section end");
42 if (!CheckSection(externalsBegin, externalsEnd, fsize)) {
43 throw runtime_error("externals section out of bounds");
45 if ((externalsEnd - externalsBegin) % sizeof(External) != 0) {
46 throw runtime_error("bogus externals section end");
48 if (!CheckSection(imagesBegin, imagesEnd, fsize)) {
49 throw runtime_error("images section out of bounds");
51 if ((imagesEnd - imagesBegin) % sizeof(Image) != 0) {
52 throw runtime_error("bogus images section end");
54 if (!CheckSection(objectsBegin, objectsEnd, fsize)) {
55 throw runtime_error("objects section out of bounds");
57 if (!CheckSection(arraysBegin, arraysEnd, fsize)) {
58 throw runtime_error("arrays section out of bounds");
62 bool ObjectFileHeader::CheckSection(
65 unsigned int fsize) const {
66 return begin >= sizeof(ObjectFileHeader)
67 && (begin < fsize || begin == end)
72 Export *ObjectFileHeader::ExportsBegin() {
73 char *data = reinterpret_cast<char *>(this);
74 return reinterpret_cast<Export *>(data + exportsBegin);
77 Export *ObjectFileHeader::ExportsEnd() {
78 char *data = reinterpret_cast<char *>(this);
79 return reinterpret_cast<Export *>(data + exportsEnd);
82 External *ObjectFileHeader::ExternalsBegin() {
83 char *data = reinterpret_cast<char *>(this);
84 return reinterpret_cast<External *>(data + externalsBegin);
87 External *ObjectFileHeader::ExternalsEnd() {
88 char *data = reinterpret_cast<char *>(this);
89 return reinterpret_cast<External *>(data + externalsEnd);
92 Image *ObjectFileHeader::ImagesBegin() {
93 char *data = reinterpret_cast<char *>(this);
94 return reinterpret_cast<Image *>(data + imagesBegin);
97 Image *ObjectFileHeader::ImagesEnd() {
98 char *data = reinterpret_cast<char *>(this);
99 return reinterpret_cast<Image *>(data + imagesEnd);
102 Object *ObjectFileHeader::ObjectsBegin() {
103 char *data = reinterpret_cast<char *>(this);
104 return reinterpret_cast<Object *>(data + objectsBegin);
107 Object *ObjectFileHeader::ObjectsEnd() {
108 char *data = reinterpret_cast<char *>(this);
109 return reinterpret_cast<Object *>(data + objectsEnd);
112 Array *ObjectFileHeader::ArraysBegin() {
113 char *data = reinterpret_cast<char *>(this);
114 return reinterpret_cast<Array *>(data + arraysBegin);
117 Array *ObjectFileHeader::ArraysEnd() {
118 char *data = reinterpret_cast<char *>(this);
119 return reinterpret_cast<Array *>(data + arraysEnd);
123 char *Object::RawObject() {
124 return reinterpret_cast<char *>(this) + sizeof(Object);
127 Object *Object::Next() {
128 return reinterpret_cast<Object *>(RawObject() + size);
132 char *Array::Data() {
133 return reinterpret_cast<char *>(this) + sizeof(Array);
136 Array *Array::Next() {
137 return reinterpret_cast<Array *>(Data() + size);