summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Brian Carlstrom <bdc@google.com> 2013-11-07 18:36:53 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2013-11-07 18:36:53 +0000
commit2d47df9fcf5ec53e2afda3ee21a6f7cafb2fd3fb (patch)
tree5d3b073e8f7d8f21643dcaa948d50bd0138c9b9c
parent55ed56bd5ba912d6b91776046bee09e779c8d879 (diff)
parentd0c09dc2177d132099a05af8537bdb9a8225af8c (diff)
Merge "Add missing error message propagation to ElfFile::SetMap"
-rw-r--r--runtime/elf_file.cc26
-rw-r--r--runtime/elf_file.h2
2 files changed, 16 insertions, 12 deletions
diff --git a/runtime/elf_file.cc b/runtime/elf_file.cc
index 15c95f2206..b3b24baf80 100644
--- a/runtime/elf_file.cc
+++ b/runtime/elf_file.cc
@@ -82,7 +82,8 @@ bool ElfFile::Setup(File* file, bool writable, bool program_header_only, std::st
// first just map ELF header to get program header size information
size_t elf_header_size = sizeof(llvm::ELF::Elf32_Ehdr);
if (!SetMap(MemMap::MapFile(elf_header_size, prot, flags, file_->Fd(), 0,
- file_->GetPath().c_str(), error_msg))) {
+ file_->GetPath().c_str(), error_msg),
+ error_msg)) {
return false;
}
// then remap to cover program header
@@ -94,14 +95,16 @@ bool ElfFile::Setup(File* file, bool writable, bool program_header_only, std::st
return false;
}
if (!SetMap(MemMap::MapFile(program_header_size, prot, flags, file_->Fd(), 0,
- file_->GetPath().c_str(), error_msg))) {
+ file_->GetPath().c_str(), error_msg),
+ error_msg)) {
*error_msg = StringPrintf("Failed to map ELF program headers: %s", error_msg->c_str());
return false;
}
} else {
// otherwise map entire file
if (!SetMap(MemMap::MapFile(file_->GetLength(), prot, flags, file_->Fd(), 0,
- file_->GetPath().c_str(), error_msg))) {
+ file_->GetPath().c_str(), error_msg),
+ error_msg)) {
*error_msg = StringPrintf("Failed to map ELF file: %s", error_msg->c_str());
return false;
}
@@ -173,9 +176,10 @@ ElfFile::~ElfFile() {
delete dynsym_symbol_table_;
}
-bool ElfFile::SetMap(MemMap* map) {
+bool ElfFile::SetMap(MemMap* map, std::string* error_msg) {
if (map == NULL) {
- // MemMap::Open should have already logged
+ // MemMap::Open should have already set an error.
+ DCHECK(!error_msg->empty());
return false;
}
map_.reset(map);
@@ -187,12 +191,12 @@ bool ElfFile::SetMap(MemMap* map) {
|| (llvm::ELF::ElfMagic[1] != header_->e_ident[llvm::ELF::EI_MAG1])
|| (llvm::ELF::ElfMagic[2] != header_->e_ident[llvm::ELF::EI_MAG2])
|| (llvm::ELF::ElfMagic[3] != header_->e_ident[llvm::ELF::EI_MAG3])) {
- LOG(WARNING) << "Failed to find ELF magic in " << file_->GetPath()
- << ": " << std::hex
- << static_cast<uint8_t>(header_->e_ident[llvm::ELF::EI_MAG0])
- << static_cast<uint8_t>(header_->e_ident[llvm::ELF::EI_MAG1])
- << static_cast<uint8_t>(header_->e_ident[llvm::ELF::EI_MAG2])
- << static_cast<uint8_t>(header_->e_ident[llvm::ELF::EI_MAG3]);
+ *error_msg = StringPrintf("Failed to find ELF magic in %s: %c%c%c%c",
+ file_->GetPath().c_str(),
+ header_->e_ident[llvm::ELF::EI_MAG0],
+ header_->e_ident[llvm::ELF::EI_MAG1],
+ header_->e_ident[llvm::ELF::EI_MAG2],
+ header_->e_ident[llvm::ELF::EI_MAG3]);
return false;
}
diff --git a/runtime/elf_file.h b/runtime/elf_file.h
index b0251370d2..f8c235d191 100644
--- a/runtime/elf_file.h
+++ b/runtime/elf_file.h
@@ -122,7 +122,7 @@ class ElfFile {
bool Setup(File* file, bool writable, bool program_header_only, std::string* error_msg);
- bool SetMap(MemMap* map);
+ bool SetMap(MemMap* map, std::string* error_msg);
byte* GetProgramHeadersStart();
byte* GetSectionHeadersStart();