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 (exportsBegin < sizeof(ObjectFileHeader)
37 || exportsBegin > fsize) {
38 throw runtime_error("exports section out of bounds");
40 if (exportsEnd < exportsBegin
42 || (exportsEnd - exportsBegin) % sizeof(Export) != 0) {
43 throw runtime_error("bogus exports section end");
45 if (externalsBegin < sizeof(ObjectFileHeader)
46 || externalsBegin >= fsize) {
47 throw runtime_error("externals section out of bounds");
49 if (externalsEnd < externalsBegin
50 || externalsEnd > fsize
51 || (externalsEnd - externalsBegin) % sizeof(External) != 0) {
52 throw runtime_error("bogus externals section end");
54 if (objectsBegin < sizeof(ObjectFileHeader)
55 || objectsBegin >= fsize
56 || objectsEnd < objectsBegin
57 || objectsEnd > fsize) {
58 throw runtime_error("objects section out of bounds");
60 if (arraysBegin < sizeof(ObjectFileHeader)
61 || arraysBegin >= fsize
62 || arraysEnd < arraysBegin
63 || arraysEnd > fsize) {
64 throw runtime_error("arrays section out of bounds");
68 Export *ObjectFileHeader::ExportsBegin() {
69 char *data = reinterpret_cast<char *>(this);
70 return reinterpret_cast<Export *>(data + exportsBegin);
73 Export *ObjectFileHeader::ExportsEnd() {
74 char *data = reinterpret_cast<char *>(this);
75 return reinterpret_cast<Export *>(data + exportsEnd);
78 External *ObjectFileHeader::ExternalsBegin() {
79 char *data = reinterpret_cast<char *>(this);
80 return reinterpret_cast<External *>(data + externalsBegin);
83 External *ObjectFileHeader::ExternalsEnd() {
84 char *data = reinterpret_cast<char *>(this);
85 return reinterpret_cast<External *>(data + externalsEnd);
88 Object *ObjectFileHeader::ObjectsBegin() {
89 char *data = reinterpret_cast<char *>(this);
90 return reinterpret_cast<Object *>(data + objectsBegin);
93 Object *ObjectFileHeader::ObjectsEnd() {
94 char *data = reinterpret_cast<char *>(this);
95 return reinterpret_cast<Object *>(data + objectsEnd);
98 Array *ObjectFileHeader::ArraysBegin() {
99 char *data = reinterpret_cast<char *>(this);
100 return reinterpret_cast<Array *>(data + arraysBegin);
103 Array *ObjectFileHeader::ArraysEnd() {
104 char *data = reinterpret_cast<char *>(this);
105 return reinterpret_cast<Array *>(data + arraysEnd);
109 char *Object::RawObject() {
110 return reinterpret_cast<char *>(this) + sizeof(Object);
113 Object *Object::Next() {
114 return reinterpret_cast<Object *>(RawObject() + size);
118 char *Array::Data() {
119 return reinterpret_cast<char *>(this) + sizeof(Array);
122 Array *Array::Next() {
123 return reinterpret_cast<Array *>(Data() + size);