diff options
Diffstat (limited to 'src/common/linux/elfutils.cc')
-rw-r--r-- | src/common/linux/elfutils.cc | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/src/common/linux/elfutils.cc b/src/common/linux/elfutils.cc index 0ff2c3dc..3bb8ff12 100644 --- a/src/common/linux/elfutils.cc +++ b/src/common/linux/elfutils.cc @@ -78,14 +78,12 @@ void FindElfClassSection(const char *elf_base, template<typename ElfClass> void FindElfClassSegment(const char *elf_base, typename ElfClass::Word segment_type, - const void **segment_start, - size_t *segment_size) { + wasteful_vector<ElfSegment> *segments) { typedef typename ElfClass::Ehdr Ehdr; typedef typename ElfClass::Phdr Phdr; assert(elf_base); - assert(segment_start); - assert(segment_size); + assert(segments); assert(my_strncmp(elf_base, ELFMAG, SELFMAG) == 0); @@ -97,9 +95,10 @@ void FindElfClassSegment(const char *elf_base, for (int i = 0; i < elf_header->e_phnum; ++i) { if (phdrs[i].p_type == segment_type) { - *segment_start = elf_base + phdrs[i].p_offset; - *segment_size = phdrs[i].p_filesz; - return; + ElfSegment seg = {}; + seg.start = elf_base + phdrs[i].p_offset; + seg.size = phdrs[i].p_filesz; + segments->push_back(seg); } } } @@ -150,16 +149,11 @@ bool FindElfSection(const void *elf_mapped_base, return false; } -bool FindElfSegment(const void *elf_mapped_base, - uint32_t segment_type, - const void **segment_start, - size_t *segment_size) { +bool FindElfSegments(const void* elf_mapped_base, + uint32_t segment_type, + wasteful_vector<ElfSegment>* segments) { assert(elf_mapped_base); - assert(segment_start); - assert(segment_size); - - *segment_start = NULL; - *segment_size = 0; + assert(segments); if (!IsValidElf(elf_mapped_base)) return false; @@ -169,13 +163,11 @@ bool FindElfSegment(const void *elf_mapped_base, static_cast<const char*>(elf_mapped_base); if (cls == ELFCLASS32) { - FindElfClassSegment<ElfClass32>(elf_base, segment_type, - segment_start, segment_size); - return *segment_start != NULL; + FindElfClassSegment<ElfClass32>(elf_base, segment_type, segments); + return true; } else if (cls == ELFCLASS64) { - FindElfClassSegment<ElfClass64>(elf_base, segment_type, - segment_start, segment_size); - return *segment_start != NULL; + FindElfClassSegment<ElfClass64>(elf_base, segment_type, segments); + return true; } return false; |