/* Copyright (C) 2007-2010 The Android Open Source Project ** ** This software is licensed under the terms of the GNU General Public ** License version 2, as published by the Free Software Foundation, and ** may be copied, distributed, and modified under those terms. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. */ /* * Contains declaration of a class ElfMappedSection, that encapsulates * a section of an ELF file, mapped to memory. */ #ifndef ELFF_ELF_MAPPED_SECTION_H_ #define ELFF_ELF_MAPPED_SECTION_H_ #include "elf_defs.h" #include "android/utils/mapfile.h" /* Encapsulates a section of an ELF file, mapped to memory. */ class ElfMappedSection { public: /* Constructs ElfMappedSection instance. */ ElfMappedSection(); /* Destructs ElfMappedSection instance. */ ~ElfMappedSection(); /* Maps ELF file section to memory. * Param: * handle - Handle to an opened ELF file. * offset - Offset of the beginning of the section data in ELF file. * NOTE: we explicitly use 64-bit type for this parameter, since we may * still allow 32-bit library to process 64 bits ELF/DWARF formats. We * really only care about section size being small enough to fit in 32 * bits value in this case (which seems to be always true for ELF files, * as section size is encoded with 32-bit value even in 64-bit ELF file). * size - Section byte size in ELF file. * Return: * true on success, or false on failure, with errno providing extended * error information. * NOTE: if section has already been mapped, this method immediately * returns with success. */ bool map(MapFile* handle, Elf_Xword offset, Elf_Word size); /* Checks if section has been mapped. */ bool is_mapped() const { return mapped_at_ != NULL; } /* Gets address of the beginning of the mapped section. */ const void* data() const { assert(is_mapped()); return data_; } /* Gets section size. */ Elf_Word size() const { assert(is_mapped()); return size_; } /* Checks if an address range is fully contained in this section. */ bool is_contained(const void* ptr, size_t rsize) const { assert(is_mapped()); return is_mapped() && is_in_section(ptr, rsize, data(), size()); } protected: /* Beginning of the memory mapping, containing the section. * NOTE: due to page alignment requirements of the mapping API, mapping * address may differ from the address where the actual section data * starts inside that mapping. */ void* mapped_at_; /* Address of the beginning of the mapped section. */ const void* data_; /* Section size. */ Elf_Word size_; }; #endif // ELFF_ELF_MAPPED_SECTION_H_