/**************************************************************************** * Copyright (C) 2018-2021 Maschell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ #pragma once #include "ExportData.h" #include "FunctionSymbolData.h" #include "HookData.h" #include "RelocationData.h" #include "SectionInfo.h" #include #include #include #include struct FunctionSymbolDataComparator { bool operator()(const std::shared_ptr &lhs, const std::shared_ptr &rhs) const { return (uint32_t) lhs->getAddress() < (uint32_t) rhs->getAddress(); } }; class ModuleData { public: ModuleData() = default; ~ModuleData() = default; void setBSSLocation(uint32_t addr, uint32_t size) { this->bssAddr = addr; this->bssSize = size; } void setSBSSLocation(uint32_t addr, uint32_t size) { this->sbssAddr = addr; this->sbssSize = size; } void setEntrypoint(uint32_t addr) { this->entrypoint = addr; } void addRelocationData(std::unique_ptr relocation_data) { relocation_data_list.push_back(std::move(relocation_data)); } [[nodiscard]] const std::vector> &getRelocationDataList() const { return relocation_data_list; } void addExportData(std::unique_ptr data) { export_data_list.push_back(std::move(data)); } [[nodiscard]] const std::vector> &getExportDataList() const { return export_data_list; } void addHookData(std::unique_ptr data) { hook_data_list.push_back(std::move(data)); } [[nodiscard]] const std::vector> &getHookDataList() const { return hook_data_list; } void addSectionInfo(std::shared_ptr sectionInfo) { section_info_list[sectionInfo->getName()] = std::move(sectionInfo); } void addFunctionSymbolData(std::shared_ptr symbol_data) { symbol_data_list.insert(std::move(symbol_data)); } [[nodiscard]] const std::set, FunctionSymbolDataComparator> &getFunctionSymbolDataList() const { return symbol_data_list; } [[nodiscard]] const std::map> &getSectionInfoList() const { return section_info_list; } [[nodiscard]] std::optional> getSectionInfo(const std::string §ionName) const { if (getSectionInfoList().count(sectionName) > 0) { return section_info_list.at(sectionName); } return {}; } [[nodiscard]] uint32_t getBSSAddress() const { return bssAddr; } [[nodiscard]] uint32_t getBSSSize() const { return bssSize; } [[nodiscard]] uint32_t getSBSSAddress() const { return sbssAddr; } [[nodiscard]] uint32_t getSBSSSize() const { return sbssSize; } [[nodiscard]] uint32_t getStartAddress() const { return reinterpret_cast(dataPtr.get()); } [[nodiscard]] uint32_t getEndAddress() const { return reinterpret_cast(dataPtr.get()) + this->totalSize; } [[nodiscard]] uint32_t getEntrypoint() const { return entrypoint; } void setExportName(std::string name) { this->export_name = std::move(name); } [[nodiscard]] const std::string &getExportName() const { return this->export_name; } [[nodiscard]] bool isInitBeforeRelocationDoneHook() const { return this->initBeforeRelocationDoneHook; } void setInitBeforeRelocationDoneHook(bool value) { this->initBeforeRelocationDoneHook = value; } [[nodiscard]] bool isSkipInitFini() const { return this->skipInitFini; } void setSkipInitFini(bool value) { this->skipInitFini = value; } void setDataPtr(std::unique_ptr ptr, uint32_t size) { this->dataPtr = std::move(ptr); this->totalSize = size; } std::unique_ptr hookDataStruct; std::unique_ptr exportDataStruct; std::unique_ptr functionSymbolDataStruct; std::unique_ptr rplDataStruct; std::unique_ptr relocationDataStruct; private: std::vector> relocation_data_list; std::vector> export_data_list; std::vector> hook_data_list; std::set, FunctionSymbolDataComparator> symbol_data_list; std::map> section_info_list; std::unique_ptr dataPtr; std::string export_name; uint32_t bssAddr = 0; uint32_t bssSize = 0; uint32_t sbssAddr = 0; uint32_t sbssSize = 0; uint32_t entrypoint = 0; uint32_t totalSize = 0; bool initBeforeRelocationDoneHook = false; bool skipInitFini = false; };