/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BaseElf_h #define BaseElf_h
#include"ElfLoader.h" #include"Elfxx.h"
/** * Base class for ELF libraries. This class includes things that will be * common between SystemElfs and CustomElfs.
*/ class BaseElf : public LibHandle { public: /** * Hash function for symbol lookup, as defined in ELF standard for System V.
*/ staticunsignedlong Hash(constchar* symbol);
/** * Returns the address corresponding to the given symbol name (with a * pre-computed hash).
*/ void* GetSymbolPtr(constchar* symbol, unsignedlong hash) const;
/** * Returns a pointer to the Elf Symbol in the Dynamic Symbol table * corresponding to the given symbol name (with a pre-computed hash).
*/ const Elf::Sym* GetSymbol(constchar* symbol, unsignedlong hash) const;
protected: /** * Inherited from LibHandle. Those are temporary and are not supposed to * be used.
*/ virtualvoid* GetSymbolPtr(constchar* symbol) const; virtualbool Contains(void* addr) const; virtualvoid* GetBase() const { return GetPtr(0); }
public: /* private: */ /** * Returns a pointer relative to the base address where the library is * loaded.
*/ void* GetPtr(const Elf::Addr offset) const { if (reinterpret_cast<void*>(offset) > base) returnreinterpret_cast<void*>(offset); return base + offset;
}
/** * Like the above, but returns a typed (const) pointer
*/ template <typename T> const T* GetPtr(const Elf::Addr offset) const { if (reinterpret_cast<void*>(offset) > base) returnreinterpret_cast<const T*>(offset); returnreinterpret_cast<const T*>(base + offset);
}
/* Appropriated Mappable */ /* /!\ we rely on this being nullptr for BaseElf instances, but not
* CustomElf instances. */
RefPtr<Mappable> mappable;
/* Base address where the library is loaded */
MappedPtr base;
/* Buckets and chains for the System V symbol hash table */
Array<Elf::Word> buckets;
UnsizedArray<Elf::Word> chains;
#ifdef __ARM_EABI__ /* ARM.exidx information used by FindExidx */
Array<uint32_t[2]> arm_exidx; #endif
};
/** * Class for ELF libraries that already loaded in memory.
*/ class LoadedElf : public BaseElf { public: /** * Returns a LoadedElf corresponding to the already loaded ELF * at the given base address.
*/ static already_AddRefed<LibHandle> Create(constchar* path, void* base_addr);
~LoadedElf() { /* Avoid base's destructor unmapping something that doesn't actually
* belong to it. */
base.release();
ElfLoader::Singleton.Forget(this);
}
/** * Initializes the library according to information found in the given * PT_DYNAMIC header. * Returns whether this succeeded or failed.
*/ bool InitDyn(const Elf::Phdr* pt_dyn);
};
#endif/* BaseElf_h */
Messung V0.5
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.