From 1ef0bc2d8854f487f740e865b4e9f9d526aaa65a Mon Sep 17 00:00:00 2001 From: kali Date: Thu, 5 Dec 2024 07:09:07 -0500 Subject: [PATCH] MemoryModule Tests --- libs/libMemoryModuleDumy/CMakeLists.txt | 2 + libs/libMemoryModuleDumy/src/MemoryModule.cpp | 12 +++++ libs/libMemoryModuleDumy/src/MemoryModule.h | 6 ++- libs/libMemoryModuleDumy/tests/CMakeLists.txt | 5 +++ libs/libMemoryModuleDumy/tests/Tests.cpp | 44 +++++++++++++++++++ libs/libMemoryModuleDumy/tests/libtest.cpp | 42 ++++++++++++++++++ 6 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 libs/libMemoryModuleDumy/tests/CMakeLists.txt create mode 100644 libs/libMemoryModuleDumy/tests/Tests.cpp create mode 100644 libs/libMemoryModuleDumy/tests/libtest.cpp diff --git a/libs/libMemoryModuleDumy/CMakeLists.txt b/libs/libMemoryModuleDumy/CMakeLists.txt index aa13baa..e08c6f4 100644 --- a/libs/libMemoryModuleDumy/CMakeLists.txt +++ b/libs/libMemoryModuleDumy/CMakeLists.txt @@ -14,3 +14,5 @@ include_directories(../src) add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES}) target_include_directories(${PROJECT_NAME} PUBLIC src) set_property(TARGET ${PROJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON) + +add_subdirectory(tests) diff --git a/libs/libMemoryModuleDumy/src/MemoryModule.cpp b/libs/libMemoryModuleDumy/src/MemoryModule.cpp index 97604b0..bd4785f 100644 --- a/libs/libMemoryModuleDumy/src/MemoryModule.cpp +++ b/libs/libMemoryModuleDumy/src/MemoryModule.cpp @@ -136,4 +136,16 @@ HMEMORYMODULE MemoryLoadLibrary(const void *moduleData, size_t size) } return handle; +} + + +void MemoryFreeLibrary(HMEMORYMODULE mod) +{ + dlclose(mod); +} + + +void* MemoryGetProcAddress(HMEMORYMODULE mod, const char* procName) +{ + return dlsym(mod, procName); } \ No newline at end of file diff --git a/libs/libMemoryModuleDumy/src/MemoryModule.h b/libs/libMemoryModuleDumy/src/MemoryModule.h index d693a71..efbc0f8 100644 --- a/libs/libMemoryModuleDumy/src/MemoryModule.h +++ b/libs/libMemoryModuleDumy/src/MemoryModule.h @@ -6,4 +6,8 @@ typedef void *HMEMORYMODULE; -HMEMORYMODULE MemoryLoadLibrary(const void *moduleData, size_t size); \ No newline at end of file +HMEMORYMODULE MemoryLoadLibrary(const void *moduleData, size_t size); + +void MemoryFreeLibrary(HMEMORYMODULE mod); + +void* MemoryGetProcAddress(HMEMORYMODULE mod, const char* procName); \ No newline at end of file diff --git a/libs/libMemoryModuleDumy/tests/CMakeLists.txt b/libs/libMemoryModuleDumy/tests/CMakeLists.txt new file mode 100644 index 0000000..57115cc --- /dev/null +++ b/libs/libMemoryModuleDumy/tests/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(TestsMemoryModule "Tests.cpp" ) +set_property(TARGET TestsMemoryModule PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") +target_link_libraries(TestsMemoryModule MemoryModule ) + + diff --git a/libs/libMemoryModuleDumy/tests/Tests.cpp b/libs/libMemoryModuleDumy/tests/Tests.cpp new file mode 100644 index 0000000..2fa2ddc --- /dev/null +++ b/libs/libMemoryModuleDumy/tests/Tests.cpp @@ -0,0 +1,44 @@ +#include + +#include "MemoryModule.h" + +typedef void* (*constructProc)(); + + +// g++ -fPIC -shared ./libtest.cpp -o libtest.so +int main() +{ + std::string inputFile = "libtest.so"; + + std::ifstream input; + input.open(inputFile, std::ios::binary); + + if( input ) + { + std::string buffer(std::istreambuf_iterator(input), {}); + + void* handle = NULL; + handle = MemoryLoadLibrary((char*)buffer.data(), buffer.size()); + if (handle == NULL) + { + return false; + } + + std::string funcName = "TestConstructor"; + + constructProc construct; + construct = (constructProc)MemoryGetProcAddress(handle, funcName.c_str()); + if(construct == NULL) + { + return false; + } + + construct(); + + MemoryFreeLibrary(handle); + + return true; + } + + return false; +} \ No newline at end of file diff --git a/libs/libMemoryModuleDumy/tests/libtest.cpp b/libs/libMemoryModuleDumy/tests/libtest.cpp new file mode 100644 index 0000000..744661c --- /dev/null +++ b/libs/libMemoryModuleDumy/tests/libtest.cpp @@ -0,0 +1,42 @@ +#include + +// g++ -fPIC -shared ./libtest.cpp -o libtest.so + +class Test +{ +public: + Test(); + ~Test(); +}; + + +#ifdef _WIN32 +extern "C" __declspec(dllexport) Test * TestConstructor(); +#else +extern "C" __attribute__((visibility("default"))) Test * TestConstructor(); +#endif + + +#ifdef _WIN32 +__declspec(dllexport) Test* TestConstructor() +{ + return new Cat(); +} +#else +__attribute__((visibility("default"))) Test* TestConstructor() +{ + return new Test(); +} +#endif + + +Test::Test() +{ + std::cout << "Test Constructor" << std::endl; +} + + +Test::~Test() +{ +} +