/* 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/. */
/** * Library Handle class for ELF libraries we don't let the system linker * handle.
*/ class CustomElf : public BaseElf, private ElfLoader::link_map { friendclass ElfLoader; friendclass SEGVHandler;
public: /** * Returns a new CustomElf using the given file descriptor to map ELF * content. The file descriptor ownership is stolen, and it will be closed * in CustomElf's destructor if an instance is created, or by the Load * method otherwise. The path corresponds to the file descriptor, and flags * are the same kind of flags that would be given to dlopen(), though * currently, none are supported and the behaviour is more or less that of * RTLD_GLOBAL | RTLD_BIND_NOW.
*/ static already_AddRefed<LibHandle> Load(Mappable* mappable, constchar* path, int flags);
/** * Inherited from LibHandle/BaseElf
*/ virtual ~CustomElf();
public: /** * Returns the instance, casted as BaseElf. (short of a better way to do * this without RTTI)
*/ virtual BaseElf* AsBaseElf() { returnthis; }
private: /** * Scan dependent libraries to find the address corresponding to the * given symbol name. This is used to find symbols that are undefined * in the Elf object.
*/ void* GetSymbolPtrInDeps(constchar* symbol) const;
/** * Loads an Elf segment defined by the given PT_LOAD header. * Returns whether this succeeded or failed.
*/ bool LoadSegment(const Elf::Phdr* pt_load) const;
/** * 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);
/** * Apply .rel.dyn/.rela.dyn relocations. * Returns whether this succeeded or failed.
*/ bool Relocate();
/** * Apply .rel.plt/.rela.plt relocations. * Returns whether this succeeded or failed.
*/ bool RelocateJumps();
/** * Call destructor functions (.fini_array/.fini) * Returns whether this succeeded or failed.
*/ void CallFini();
/** * Call a function given a pointer to its location.
*/ void CallFunction(void* ptr) const { /* C++ doesn't allow direct conversion between pointer-to-object
* and pointer-to-function. */ union { void* ptr; void (*func)(void);
} f;
f.ptr = ptr;
DEBUG_LOG("%s: Calling function @%p", GetPath(), ptr);
f.func();
}
/** * Call a function given a an address relative to the library base
*/ void CallFunction(Elf::Addr addr) const { return CallFunction(GetPtr(addr)); }
/* List of dependent libraries */
std::vector<RefPtr<LibHandle> > dependencies;
/* List of .rel.dyn/.rela.dyn relocations */
Array<Elf::Reloc> relocations;
/* List of .rel.plt/.rela.plt relocation */
Array<Elf::Reloc> jumprels;
/* Relative address of the initialization and destruction functions
* (.init/.fini) */
Elf::Addr init, fini;
/* List of initialization and destruction functions
* (.init_array/.fini_array) */
Array<void*> init_array, fini_array;
bool initialized;
bool has_text_relocs;
};
#endif/* CustomElf_h */
Messung V0.5
¤ Dauer der Verarbeitung: 0.11 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.