/* 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_ |