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