From f54c3617183ab559602c56693bd1a3108c1362bd Mon Sep 17 00:00:00 2001 From: lethosor Date: Sat, 8 Feb 2020 21:17:53 -0500 Subject: [PATCH] Add an implementation of mifki's sizecheck library (tested on Linux) --- CMakeLists.txt | 6 +++++ depends/sizecheck/CMakeLists.txt | 6 +++++ depends/sizecheck/sizecheck.cpp | 43 ++++++++++++++++++++++++++++++++ plugins/devel/memview.cpp | 2 +- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 depends/sizecheck/CMakeLists.txt create mode 100644 depends/sizecheck/sizecheck.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 06b94e2e0..500553a86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -540,3 +540,9 @@ endif() # Store old build arch set(DFHACK_BUILD_ARCH_PREV "${DFHACK_BUILD_ARCH}" CACHE STRING "Previous build architecture" FORCE) + +option(BUILD_SIZECHECK "Build the sizecheck library, for research" OFF) +if(BUILD_SIZECHECK) + add_subdirectory(depends/sizecheck) + add_dependencies(dfhack sizecheck) +endif() diff --git a/depends/sizecheck/CMakeLists.txt b/depends/sizecheck/CMakeLists.txt new file mode 100644 index 000000000..b0d723631 --- /dev/null +++ b/depends/sizecheck/CMakeLists.txt @@ -0,0 +1,6 @@ +project(sizecheck) +add_library(sizecheck SHARED sizecheck.cpp) +ide_folder(sizecheck "Depends") +install(TARGETS sizecheck + LIBRARY DESTINATION ${DFHACK_LIBRARY_DESTINATION} + RUNTIME DESTINATION ${DFHACK_LIBRARY_DESTINATION}) diff --git a/depends/sizecheck/sizecheck.cpp b/depends/sizecheck/sizecheck.cpp new file mode 100644 index 000000000..4a05feccf --- /dev/null +++ b/depends/sizecheck/sizecheck.cpp @@ -0,0 +1,43 @@ +// adapted from https://github.com/mifki/df-sizecheck/blob/master/b.cpp +// usage: +// linux: PRELOAD_LIB=hack/libsizecheck.so ./dfhack + +#include +#include +#include +#include +#include + +using namespace std; + +const uint32_t MAGIC = 0xdfdf4ac8; + +void* alloc(size_t n) { + void* addr; + if (posix_memalign(&addr, 32, n + 16) != 0) { + return addr; + } + memset(addr, 0, 16); + *(size_t*)addr = n; + *(uint32_t*)((uint8_t*)addr + 8) = MAGIC; + return (uint8_t*)addr + 16; +} + +void dealloc(void* addr) { + if (intptr_t(addr) % 32 == 16 && *(size_t*)((uint8_t*)addr - 8) == MAGIC) { + addr = (void*)((uint8_t*)addr - 16); + } + free(addr); +} + +void* operator new (size_t n, const nothrow_t& tag) { + return alloc(n); +} + +void* operator new (size_t n) { + return alloc(n); +} + +void operator delete (void* addr) { + return dealloc(addr); +} diff --git a/plugins/devel/memview.cpp b/plugins/devel/memview.cpp index 429fec409..3f0178b03 100644 --- a/plugins/devel/memview.cpp +++ b/plugins/devel/memview.cpp @@ -117,7 +117,7 @@ void Deinit() size_t detect_size(void *addr) { size_t *size = (size_t*)((char*)addr - 16); int32_t *tag = (int32_t*)((char*)addr - 8); - if (isAddr(size, memdata.ranges) && *tag == 0x11223344) { + if (isAddr(size, memdata.ranges) && (*tag == 0x11223344 || *tag == 0xdfdf4ac8)) { return *size; } // default