ART: Fix loading PIC oat files without image for oatdump.

Test: oatdump --oat-file=services.odex (manual)
Bug: 66984877
Change-Id: I1dd57424745401bccf500c688ff6f4e408e89d8b
diff --git a/runtime/oat_file.cc b/runtime/oat_file.cc
index b2f6c03..9a42c29 100644
--- a/runtime/oat_file.cc
+++ b/runtime/oat_file.cc
@@ -635,29 +635,35 @@
   }
 
   if (boot_image_tables != nullptr) {
-    // Map boot image tables into the .bss. The reserved size must match size of the tables.
-    size_t reserved_size = static_cast<size_t>(boot_image_tables_end - boot_image_tables);
-    size_t tables_size = 0u;
-    for (gc::space::ImageSpace* space : Runtime::Current()->GetHeap()->GetBootImageSpaces()) {
-      tables_size += space->GetImageHeader().GetBootImageConstantTablesSize();
-      DCHECK_ALIGNED(tables_size, kPageSize);
-    }
-    if (tables_size != reserved_size) {
-      *error_msg = StringPrintf("In oat file '%s' found unexpected boot image table sizes, "
-                                    " %zu bytes, should be %zu.",
-                                GetLocation().c_str(),
-                                reserved_size,
-                                tables_size);
-      return false;
-    }
-    for (gc::space::ImageSpace* space : Runtime::Current()->GetHeap()->GetBootImageSpaces()) {
-      uint32_t current_tables_size = space->GetImageHeader().GetBootImageConstantTablesSize();
-      if (current_tables_size != 0u && !MapConstantTables(space, boot_image_tables)) {
+    Runtime* runtime = Runtime::Current();
+    if (UNLIKELY(runtime == nullptr)) {
+      // This must be oatdump without boot image. Make sure the .bss is inaccessible.
+      mprotect(const_cast<uint8_t*>(BssBegin()), BssSize(), PROT_NONE);
+    } else {
+      // Map boot image tables into the .bss. The reserved size must match size of the tables.
+      size_t reserved_size = static_cast<size_t>(boot_image_tables_end - boot_image_tables);
+      size_t tables_size = 0u;
+      for (gc::space::ImageSpace* space : runtime->GetHeap()->GetBootImageSpaces()) {
+        tables_size += space->GetImageHeader().GetBootImageConstantTablesSize();
+        DCHECK_ALIGNED(tables_size, kPageSize);
+      }
+      if (tables_size != reserved_size) {
+        *error_msg = StringPrintf("In oat file '%s' found unexpected boot image table sizes, "
+                                      " %zu bytes, should be %zu.",
+                                  GetLocation().c_str(),
+                                  reserved_size,
+                                  tables_size);
         return false;
       }
-      boot_image_tables += current_tables_size;
+      for (gc::space::ImageSpace* space : Runtime::Current()->GetHeap()->GetBootImageSpaces()) {
+        uint32_t current_tables_size = space->GetImageHeader().GetBootImageConstantTablesSize();
+        if (current_tables_size != 0u && !MapConstantTables(space, boot_image_tables)) {
+          return false;
+        }
+        boot_image_tables += current_tables_size;
+      }
+      DCHECK(boot_image_tables == boot_image_tables_end);
     }
-    DCHECK(boot_image_tables == boot_image_tables_end);
   }
   return true;
 }