Separate oat from image

Change-Id: If2abdb99826ead14e3465d90ba2acffd89709389
diff --git a/src/image.h b/src/image.h
index fdf6443..3d2f5f4 100644
--- a/src/image.h
+++ b/src/image.h
@@ -11,12 +11,25 @@
 namespace art {
 
 // header of image files written by ImageWriter, read and validated by Space.
-class ImageHeader {
+class PACKED ImageHeader {
  public:
   ImageHeader() {}
 
-  ImageHeader(uint32_t base_addr, uint32_t image_roots)
-      : base_addr_(base_addr), image_roots_(image_roots) {
+  ImageHeader(uint32_t image_base_addr,
+              uint32_t image_roots,
+              uint32_t oat_checksum,
+              uint32_t oat_base_addr,
+              uint32_t oat_limit_addr)
+      : image_base_addr_(image_base_addr),
+        oat_checksum_(oat_checksum),
+        oat_base_addr_(oat_base_addr),
+        oat_limit_addr_(oat_limit_addr),
+        image_roots_(image_roots) {
+    CHECK_EQ(image_base_addr, RoundUp(image_base_addr, kPageSize));
+    CHECK_EQ(oat_base_addr, RoundUp(oat_base_addr, kPageSize));
+    CHECK_LT(image_base_addr, image_roots);
+    CHECK_LT(image_roots, oat_base_addr);
+    CHECK_LT(oat_base_addr, oat_limit_addr);
     memcpy(magic_, kImageMagic, sizeof(kImageMagic));
     memcpy(version_, kImageVersion, sizeof(kImageVersion));
   }
@@ -36,13 +49,27 @@
     return reinterpret_cast<const char*>(magic_);
   }
 
-  byte* GetBaseAddr() const {
-    return reinterpret_cast<byte*>(base_addr_);
+  byte* GetImageBaseAddr() const {
+    return reinterpret_cast<byte*>(image_base_addr_);
+  }
+
+  uint32_t GetOatChecksum() const {
+    return oat_checksum_;
+  }
+
+  byte* GetOatBaseAddr() const {
+    return reinterpret_cast<byte*>(oat_base_addr_);
+  }
+
+  byte* GetOatLimitAddr() const {
+    return reinterpret_cast<byte*>(oat_limit_addr_);
   }
 
   enum ImageRoot {
     kJniStubArray,
+    kAbstractMethodErrorStubArray,
     kCalleeSaveMethod,
+    kOatLocation,
     kImageRootsMax,
   };
 
@@ -58,7 +85,16 @@
   byte version_[4];
 
   // required base address for mapping the image.
-  uint32_t base_addr_;
+  uint32_t image_base_addr_;
+
+  // checksum of the oat file we link to for load time sanity check
+  uint32_t oat_checksum_;
+
+  // required oat address expected by image Method::GetCode() pointers.
+  uint32_t oat_base_addr_;
+
+  // end of oat address range for this image file, used for positioning a following image
+  uint32_t oat_limit_addr_;
 
   // absolute address of an Object[] of objects needed to reinitialize from an image
   uint32_t image_roots_;