#pragma once #include "Linux/Utils/ELFContainer.h" #include #include #include #include #include #include #include namespace ELFLoader { class ELFSymbolDatabase final { public: ELFSymbolDatabase(::ELFLoader::ELFContainer *file); ~ELFSymbolDatabase(); uint64_t GetElfBase() const; void MapMemoryRegions(std::function Mapper); void WriteLoadableSections(::ELFLoader::ELFContainer::MemoryWriter Writer); uint64_t DefaultRIP() const; using RangeType = std::pair; ::ELFLoader::ELFSymbol const *GetSymbolInRange(RangeType Address); ::ELFLoader::ELFSymbol const *GetGlobalSymbolInRange(RangeType Address); ::ELFLoader::ELFSymbol const *GetNoWeakSymbolInRange(RangeType Address); void GetInitLocations(std::vector *Locations); private: ::ELFLoader::ELFContainer *File; struct ELFInfo { std::string Name; ::ELFLoader::ELFContainer* Container; ::ELFLoader::ELFContainer::MemoryLayout CustomLayout; void *ELFBase; uint64_t GuestBase; }; ELFInfo LocalInfo; std::vector DynamicELFInfo; std::vector InitializationOrder; uint64_t ELFMemorySize{}; bool FixedNoReplace {true}; void *ELFBase{}; std::unordered_map NameToELF; std::vector LibrarySearchPaths; // Symbols std::vector Symbols; using SymbolTableType = std::unordered_map; SymbolTableType SymbolMap; SymbolTableType SymbolMapGlobalOnly; SymbolTableType SymbolMapNoWeak; SymbolTableType SymbolMapNoMain; SymbolTableType SymbolMapNoMainNoWeak; std::map SymbolMapByAddress; bool FindLibraryFile(std::string *Result, const char *Library); void FillLibrarySearchPaths(); void FillMemoryLayouts(uint64_t DefinedBase); void FillInitializationOrder(); void FillSymbols(); void HandleRelocations(); ::ELFLoader::ELFSymbol const *GetSymbolFromTable(RangeType Address, std::unordered_map &Table); }; }