From c88c0616135b1b48967ca878a7aae3c19a8a6ce4 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sat, 6 Jun 2020 16:46:11 +0200 Subject: [PATCH] Add module defines --- include/wums/common.h | 1 + .../wums/defines/dynamic_linking_defines.h | 61 ++++++++++++++++ include/wums/defines/export_defines.h | 10 +++ include/wums/defines/module_defines.h | 69 +++++++++++++++++++ include/wums/defines/relocation_defines.h | 20 ++++++ 5 files changed, 161 insertions(+) create mode 100644 include/wums/defines/dynamic_linking_defines.h create mode 100644 include/wums/defines/export_defines.h create mode 100644 include/wums/defines/module_defines.h create mode 100644 include/wums/defines/relocation_defines.h diff --git a/include/wums/common.h b/include/wums/common.h index 1d3ade4..6a36ee0 100644 --- a/include/wums/common.h +++ b/include/wums/common.h @@ -34,6 +34,7 @@ #include #include #include +#include "defines/module_defines.h" #ifdef __cplusplus extern "C" { diff --git a/include/wums/defines/dynamic_linking_defines.h b/include/wums/defines/dynamic_linking_defines.h new file mode 100644 index 0000000..716936a --- /dev/null +++ b/include/wums/defines/dynamic_linking_defines.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * Copyright (C) 2018 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 +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define DYN_LINK_FUNCTION_NAME_LENGTH 351 +#define DYN_LINK_IMPORT_NAME_LENGTH 50 + +#define DYN_LINK_FUNCTION_LIST_LENGTH 500 +#define DYN_LINK_IMPORT_LIST_LENGTH 50 + +#define DYN_LINK_TRAMPOLIN_LIST_LENGTH DYN_LINK_FUNCTION_LIST_LENGTH + +typedef struct _dyn_linking_function_t { + char functionName[DYN_LINK_FUNCTION_NAME_LENGTH + 1]; + void *address; +} dyn_linking_function_t; + +typedef struct _dyn_linking_import_t { + char importName[DYN_LINK_IMPORT_NAME_LENGTH + 1]; + bool isData = false; +} dyn_linking_import_t; + +typedef struct _dyn_linking_relocation_entry_t { + dyn_linking_function_t *functionEntry = NULL; + dyn_linking_import_t *importEntry = NULL; + void *destination = NULL; + char type; + size_t offset; + int32_t addend; +} dyn_linking_relocation_entry_t; + +typedef struct _dyn_linking_relocation_data_t { + dyn_linking_function_t functions[DYN_LINK_FUNCTION_LIST_LENGTH]; + dyn_linking_import_t imports[DYN_LINK_IMPORT_LIST_LENGTH]; +} dyn_linking_relocation_data_t; + +#ifdef __cplusplus +} +#endif diff --git a/include/wums/defines/export_defines.h b/include/wums/defines/export_defines.h new file mode 100644 index 0000000..6b007c7 --- /dev/null +++ b/include/wums/defines/export_defines.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +#define EXPORT_MAXIMUM_NAME_LENGTH 50 +typedef struct export_data_t { + uint32_t type; + char name[EXPORT_MAXIMUM_NAME_LENGTH]; + uint32_t address = 0; +} export_data_t; \ No newline at end of file diff --git a/include/wums/defines/module_defines.h b/include/wums/defines/module_defines.h new file mode 100644 index 0000000..219742d --- /dev/null +++ b/include/wums/defines/module_defines.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * Copyright (C) 2018-2019 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 +#include +#include "dynamic_linking_defines.h" +#include "relocation_defines.h" +#include "export_defines.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAXIMUM_MODULE_PATH_NAME_LENGTH 256 +#define MAXIMUM_EXPORT_MODULE_NAME_LENGTH 51 + +#define DYN_LINK_RELOCATION_LIST_LENGTH 500 +#define EXPORT_ENTRY_LIST_LENGTH 100 +#define HOOK_ENTRY_LIST_LENGTH 10 + +typedef struct hook_data_t { + uint32_t type; + uint32_t target = 0; +} hook_data_t; + +struct module_information_single_t { + char path[MAXIMUM_MODULE_PATH_NAME_LENGTH] = ""; // Path where the module is stored + dyn_linking_relocation_entry_t linking_entries[DYN_LINK_RELOCATION_LIST_LENGTH]; + char module_export_name[MAXIMUM_EXPORT_MODULE_NAME_LENGTH]; + export_data_t export_entries[EXPORT_ENTRY_LIST_LENGTH]; + hook_data_t hook_entries[HOOK_ENTRY_LIST_LENGTH]; + int32_t priority; // Priority of this module + uint32_t bssAddr; + uint32_t bssSize; + uint32_t sbssAddr; + uint32_t sbssSize; + uint32_t entrypoint; + uint32_t startAddress; + uint32_t endAddress; +}; + +#define MAXIMUM_MODULES 8 + +struct module_information_t { + int32_t number_used_modules = 0; // Number of used function. Maximum is MAXIMUM_MODULES + dyn_linking_relocation_data_t linking_data; + relocation_trampolin_entry_t trampolines[DYN_LINK_TRAMPOLIN_LIST_LENGTH]; + module_information_single_t module_data[MAXIMUM_MODULES]; +}; + +#ifdef __cplusplus +} +#endif diff --git a/include/wums/defines/relocation_defines.h b/include/wums/defines/relocation_defines.h new file mode 100644 index 0000000..5efdf79 --- /dev/null +++ b/include/wums/defines/relocation_defines.h @@ -0,0 +1,20 @@ +#pragma once +#include + +typedef enum RelocationTrampolinStatus{ + RELOC_TRAMP_FREE = 0, + RELOC_TRAMP_FIXED = 1, + RELOC_TRAMP_IMPORT_IN_PROGRESS = 2, + RELOC_TRAMP_IMPORT_DONE = 3, +} RelocationTrampolinStatus; + +typedef enum RelocationType{ + RELOC_TYPE_FIXED = 0, + RELOC_TYPE_IMPORT = 1 +} RelocationType; + +typedef struct relocation_trampolin_entry_t { + uint32_t id; + uint32_t trampolin[4]; + RelocationTrampolinStatus status = RELOC_TRAMP_FREE; +} relocation_trampolin_entry_t;