201class EXPORTED_PUBLIC
Elf {
212 enum class ExecutableValidationResult {
218 MultipleInterpreters,
223 uintptr_t entryPoint;
224 size_t programHeaderOffset;
225 size_t programHeaderCount;
226 size_t programHeaderSize;
229 size_t interpreterOffset;
230 size_t interpreterSize;
234 static constexpr size_t MaximumProgramHeaderTableSize = 65536;
235 static constexpr size_t MaximumInterpreterSize = 4096;
247 bool validate(uint8_t* pBuffer,
size_t length);
251 static ExecutableValidationResult validateExecutableHeader(
const uint8_t* pBuffer,
size_t length,
257 static ExecutableValidationResult validateExecutableProgramHeaders(
const uint8_t* pBuffer,
258 size_t length,
size_t fileSize,
262 static ExecutableValidationResult validateExecutableInterpreter(
267 bool create(uint8_t* pBuffer,
size_t length);
271 bool createNeededOnly(uint8_t* pBuffer,
size_t length);
276 bool loadModule(uint8_t* pBuffer,
size_t length, uintptr_t& loadBase,
size_t& loadSize,
284 bool finaliseModule(uint8_t* pBuffer,
size_t length);
290 bool allocate(uint8_t* pBuffer,
size_t length, uintptr_t& loadBase,
SymbolTable* pSymtab = 0,
291 bool bAllocate =
true,
size_t* pSize = 0);
302 bool load(uint8_t* pBuffer,
size_t length, uintptr_t loadBase,
SymbolTable* pSymtab = 0,
303 uintptr_t nStart = 0, uintptr_t nEnd = ~0,
bool relocate =
true,
304 uintptr_t destinationBase = 0);
307 static bool extractEntryPoint(uint8_t* pBuffer,
size_t length, uintptr_t& entry);
310 static bool extractInformation(uint8_t* pBuffer,
size_t length,
size_t& phdrCount,
311 size_t& phdrEntrySize, uintptr_t& phdrAddress);
322 uintptr_t getLastAddress();
324 uintptr_t getInitFunc() {
327 uintptr_t getFiniFunc() {
336 template <
class T = ElfSymbol_t>
337 const char* lookupSymbol(uintptr_t addr, uintptr_t* startAddr, T* symbolTable);
341 const char* lookupSymbol(uintptr_t addr, uintptr_t* startAddr);
344 uintptr_t lookupSymbol(
const char* pName);
348 uintptr_t lookupDynamicSymbolAddress(
const char* str, uintptr_t loadBase);
352 uintptr_t applySpecificRelocation(uintptr_t off,
SymbolTable* pSymtab, uintptr_t loadBase,
357 uintptr_t getGlobalOffsetTable();
367 void populateSymbolTable(
SymbolTable* pSymtab, uintptr_t loadBase);
370 void preallocateSymbols(
SymbolTable* pSymtabOverride =
nullptr,
374 return &m_SymbolTable;
378 uintptr_t getEntryPoint();
380 uintptr_t debugFrameTable();
381 uintptr_t debugFrameTableLength();
451 Elf32_Xword addralign;
515 template <
typename T>
518 bool relocate(uint8_t* pBuffer, uintptr_t length);
519 bool relocateModinfo(uint8_t* pBuffer, uintptr_t length);
531 uintptr_t destinationAddress = 0, uintptr_t destinationEnd = 0);
543 uintptr_t destinationAddress = 0, uintptr_t destinationEnd = 0);
546 bool applyArmRelocation(Elf_Word type, Elf_Word symbolIndex, uintptr_t offset, intptr_t addend,
549 uintptr_t destinationEnd);
553 void rebaseDynamic();
557 size_t m_nSymbolTableSize;
558 char* m_pStringTable;
559 size_t m_nStringTableSize;
561 size_t m_nShstrtabSize;
562 uintptr_t* m_pGotTable;
565 size_t m_nRelTableSize;
566 size_t m_nRelaTableSize;
570 uint32_t* m_pDebugTable;
571 size_t m_nDebugTableSize;
573 size_t m_nDynamicSymbolTableSize;
574 char* m_pDynamicStringTable;
575 size_t m_nDynamicStringTableSize;
577 size_t m_nSectionHeaders;
579 size_t m_nProgramHeaders;
584 uintptr_t m_InitFunc;
585 uintptr_t m_FiniFunc;
589 uintptr_t m_LoadBase;