Refactor ElfWriter and introduce ElfWriterQuick

Change-Id: I3eaa1fa1085bb4d28fe342a7420272720e48274b
diff --git a/src/elf_file.cc b/src/elf_file.cc
index 6f9d53c..cb4ef81 100644
--- a/src/elf_file.cc
+++ b/src/elf_file.cc
@@ -616,24 +616,28 @@
     // which either was specified in the file because we already set
     // base_address_ after the first zero segment).
     if (program_header.p_vaddr == 0) {
-        std::string reservation_name("ElfFile reservation for ");
-        reservation_name += file_->GetPath();
-        UniquePtr<MemMap> reserve(MemMap::MapAnonymous(reservation_name.c_str(),
-                                                       NULL, GetLoadedSize(), PROT_NONE));
-        CHECK(reserve.get() != NULL) << file_->GetPath();
-        base_address_ = reserve->Begin();
-        segments_.push_back(reserve.release());
+      std::string reservation_name("ElfFile reservation for ");
+      reservation_name += file_->GetPath();
+      UniquePtr<MemMap> reserve(MemMap::MapAnonymous(reservation_name.c_str(),
+                                                     NULL, GetLoadedSize(), PROT_NONE));
+      CHECK(reserve.get() != NULL) << file_->GetPath();
+      base_address_ = reserve->Begin();
+      segments_.push_back(reserve.release());
+    }
+    // empty segment, nothing to map
+    if (program_header.p_memsz == 0) {
+      continue;
     }
     byte* p_vaddr = base_address_ + program_header.p_vaddr;
     int prot = 0;
     if ((program_header.p_flags & llvm::ELF::PF_X) != 0) {
-        prot |= PROT_EXEC;
+      prot |= PROT_EXEC;
     }
     if ((program_header.p_flags & llvm::ELF::PF_W) != 0) {
-        prot |= PROT_WRITE;
+      prot |= PROT_WRITE;
     }
     if ((program_header.p_flags & llvm::ELF::PF_R) != 0) {
-        prot |= PROT_READ;
+      prot |= PROT_READ;
     }
     int flags = MAP_FIXED;
     if (writable_) {