diff options
author | Dmitriy Ivanov <dimitry@google.com> | 2015-10-19 16:57:46 -0700 |
---|---|---|
committer | Dmitriy Ivanov <dimitry@google.com> | 2015-10-22 18:01:56 -0700 |
commit | cf1cbbe43293b05e564b9d044147efbcfbcc993e (patch) | |
tree | 4c838cec973542e1bfcfabe2e7478311eecfaa2c /linker/linker_phdr.cpp | |
parent | 5edf077c5b92f0db212e45ed5402339a6e4c7334 (diff) |
refactoring: introduce MappedFileFragment
Change-Id: I97b0c1131711ed0ac13ab33e3357e99e0b6b1a4e
Diffstat (limited to 'linker/linker_phdr.cpp')
-rw-r--r-- | linker/linker_phdr.cpp | 26 |
1 files changed, 5 insertions, 21 deletions
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp index 30bc6fabd..6fe808421 100644 --- a/linker/linker_phdr.cpp +++ b/linker/linker_phdr.cpp @@ -134,18 +134,11 @@ static int GetTargetElfMachine() { MAYBE_MAP_FLAG((x), PF_W, PROT_WRITE)) ElfReader::ElfReader(const char* name, int fd, off64_t file_offset, off64_t file_size) - : name_(name), fd_(fd), file_offset_(file_offset), file_size_(file_size), - phdr_num_(0), phdr_mmap_(nullptr), phdr_table_(nullptr), phdr_size_(0), - load_start_(nullptr), load_size_(0), load_bias_(0), + : name_(name), fd_(fd), file_offset_(file_offset), file_size_(file_size), phdr_num_(0), + phdr_table_(nullptr), load_start_(nullptr), load_size_(0), load_bias_(0), loaded_phdr_(nullptr) { } -ElfReader::~ElfReader() { - if (phdr_mmap_ != nullptr) { - munmap(phdr_mmap_, phdr_size_); - } -} - bool ElfReader::Load(const android_dlextinfo* extinfo) { return ReadElfHeader() && VerifyElfHeader() && @@ -234,21 +227,12 @@ bool ElfReader::ReadProgramHeader() { return false; } - ElfW(Addr) page_min = PAGE_START(header_.e_phoff); - ElfW(Addr) page_max = PAGE_END(header_.e_phoff + (phdr_num_ * sizeof(ElfW(Phdr)))); - ElfW(Addr) page_offset = PAGE_OFFSET(header_.e_phoff); - - phdr_size_ = page_max - page_min; - - void* mmap_result = - mmap64(nullptr, phdr_size_, PROT_READ, MAP_PRIVATE, fd_, file_offset_ + page_min); - if (mmap_result == MAP_FAILED) { + if (!phdr_fragment_.Map(fd_, file_offset_, header_.e_phoff, phdr_num_ * sizeof(ElfW(Phdr)))) { DL_ERR("\"%s\" phdr mmap failed: %s", name_, strerror(errno)); return false; } - phdr_mmap_ = mmap_result; - phdr_table_ = reinterpret_cast<ElfW(Phdr)*>(reinterpret_cast<char*>(mmap_result) + page_offset); + phdr_table_ = static_cast<ElfW(Phdr)*>(phdr_fragment_.data()); return true; } @@ -829,7 +813,7 @@ bool ElfReader::FindPhdr() { bool ElfReader::CheckPhdr(ElfW(Addr) loaded) { const ElfW(Phdr)* phdr_limit = phdr_table_ + phdr_num_; ElfW(Addr) loaded_end = loaded + (phdr_num_ * sizeof(ElfW(Phdr))); - for (ElfW(Phdr)* phdr = phdr_table_; phdr < phdr_limit; ++phdr) { + for (const ElfW(Phdr)* phdr = phdr_table_; phdr < phdr_limit; ++phdr) { if (phdr->p_type != PT_LOAD) { continue; } |