Working dex2oat and oatexec

adb shell dex2oatd --dex-file=/system/framework/core.jar     --image=/system/framework/boot.oat --base=0x50000000 "'--method=Ljava/lang/System;logI(Ljava/lang/String;)V'" "'--method=Ljava/lang/System;log(CLjava/lang/String;Ljava/lang/Throwable;)V'"
adb shell dex2oatd --boot-dex-file=/system/framework/core.jar --boot=/system/framework/boot.oat --dex-file=/system/framework/art-test-dex-HelloWorld.jar --image=/system/framework/art-test-dex-HelloWorld.oat
adb shell oatexecd -Xbootclasspath:/system/framework/core.jar -Xbootimage:/system/framework/boot.oat -classpath /system/framework/art-test-dex-HelloWorld.jar -Ximage:/system/framework/art-test-dex-HelloWorld.oat HelloWorld

09-05 17:58:18.912  2385  2385 I System  : Hello, world!

Change-Id: I53e534068584f0c3a837313e4d517a0e4a7154fc
diff --git a/src/space.cc b/src/space.cc
index 36eb1f6..36e3cf2 100644
--- a/src/space.cc
+++ b/src/space.cc
@@ -59,18 +59,25 @@
 
 bool Space::Init(size_t initial_size, size_t maximum_size, byte* requested_base) {
   if (!(initial_size <= maximum_size)) {
+    LOG(WARNING) << "Failed to create space with initial size > maximum size ("
+                 << initial_size << ">" << maximum_size << ")";
     return false;
   }
   size_t length = RoundUp(maximum_size, kPageSize);
   int prot = PROT_READ | PROT_WRITE;
   UniquePtr<MemMap> mem_map(MemMap::Map(requested_base, length, prot));
   if (mem_map.get() == NULL) {
+    LOG(WARNING) << "Failed to allocate " << length << " bytes for space";
     return false;
   }
   Init(mem_map.release());
   maximum_size_ = maximum_size;
   mspace_ = CreateMallocSpace(base_, initial_size, maximum_size);
-  return (mspace_ != NULL);
+  if (mspace_ == NULL) {
+    LOG(WARNING) << "Failed to create mspace for space";
+    return false;
+  }
+  return true;
 }
 
 void Space::Init(MemMap* mem_map) {
@@ -83,17 +90,24 @@
 bool Space::Init(const char* image_file_name) {
   UniquePtr<File> file(OS::OpenFile(image_file_name, false));
   if (file.get() == NULL) {
+    LOG(WARNING) << "Failed to open " << image_file_name;
     return false;
   }
   ImageHeader image_header;
   bool success = file->ReadFully(&image_header, sizeof(image_header));
   if (!success || !image_header.IsValid()) {
+    LOG(WARNING) << "Invalid image header " << image_file_name;
     return false;
   }
   UniquePtr<MemMap> map(MemMap::Map(image_header.GetBaseAddr(),
-      file->Length(), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
-      file->Fd(), 0));
+                                    file->Length(),
+                                    // TODO: selectively PROT_EXEC when image contains a code space
+                                    PROT_READ | PROT_WRITE | PROT_EXEC,
+                                    MAP_PRIVATE | MAP_FIXED,
+                                    file->Fd(),
+                                    0));
   if (map.get() == NULL) {
+    LOG(WARNING) << "Failed to map " << image_file_name;
     return false;
   }
   CHECK_EQ(image_header.GetBaseAddr(), map->GetAddress());