}
};
+struct mmap
+{
+ static constexpr auto name = "mmap";
+ static constexpr auto original = &::mmap;
+
+ static void *hook(void *addr,
+ size_t length,
+ int prot,
+ int flags,
+ int fd,
+ off_t offset)
+ {
+ void *ret = original(addr, length, prot, flags, fd, offset);
+
+ if (ret != MAP_FAILED) {
+ heaptrack_mmap(ret, length, prot, flags, fd, offset);
+ }
+
+ return ret;
+ }
+};
+
+struct mmap64
+{
+ static constexpr auto name = "mmap64";
+ static constexpr auto original = &::mmap64;
+
+ static void *hook(void *addr,
+ size_t length,
+ int prot,
+ int flags,
+ int fd,
+ off64_t offset)
+ {
+ void *ret = original(addr, length, prot, flags, fd, offset);
+
+ if (ret != MAP_FAILED) {
+ heaptrack_mmap(ret, length, prot, flags, fd, offset);
+ }
+
+ return ret;
+ }
+};
+
+struct munmap
+{
+ static constexpr auto name = "munmap";
+ static constexpr auto original = &::munmap;
+
+ static int hook(void *addr,
+ size_t length)
+ {
+ int ret = original(addr, length);
+
+ if (ret != -1) {
+ heaptrack_munmap(addr, length);
+ }
+
+ return ret;
+ }
+};
+
template <typename Hook>
bool hook(const char* symname, Elf::Addr addr, bool restore)
{
|| hook<cfree>(symname, addr, restore)
#endif
|| hook<posix_memalign>(symname, addr, restore) || hook<dlopen>(symname, addr, restore)
- || hook<dlclose>(symname, addr, restore);
+ || hook<dlclose>(symname, addr, restore)
+ || hook<mmap>(symname, addr, restore)
+ || hook<mmap64>(symname, addr, restore)
+ || hook<munmap>(symname, addr, restore);
}
}
#include <cstring>
#include <dlfcn.h>
+#include <sys/mman.h>
+
#include <atomic>
#include <type_traits>
#endif
HOOK(dlopen);
HOOK(dlclose);
+HOOK(mmap);
+HOOK(mmap64);
+HOOK(munmap);
/**
* Dummy implementation, since the call to dlsym from findReal triggers a call
#if HAVE_ALIGNED_ALLOC
hooks::aligned_alloc.init();
#endif
+ hooks::mmap.init();
+ hooks::mmap64.init();
+ hooks::munmap.init();
// cleanup environment to prevent tracing of child apps
unsetenv("LD_PRELOAD");
return ret;
}
+void *mmap(void *addr,
+ size_t length,
+ int prot,
+ int flags,
+ int fd,
+ off_t offset)
+{
+ if (!hooks::mmap) {
+ hooks::init();
+ }
+
+ void *ret = hooks::mmap(addr, length, prot, flags, fd, offset);
+
+ if (ret != MAP_FAILED) {
+ heaptrack_mmap(ret, length, prot, flags, fd, offset);
+ }
+
+ return ret;
+}
+
+void *mmap64(void *addr,
+ size_t length,
+ int prot,
+ int flags,
+ int fd,
+ off64_t offset)
+{
+ if (!hooks::mmap64) {
+ hooks::init();
+ }
+
+ void *ret = hooks::mmap64(addr, length, prot, flags, fd, offset);
+
+ if (ret != MAP_FAILED) {
+ heaptrack_mmap(ret, length, prot, flags, fd, offset);
+ }
+
+ return ret;
+}
+
+int munmap(void *addr,
+ size_t length)
+{
+ if (!hooks::munmap) {
+ hooks::init();
+ }
+
+ int ret = hooks::munmap(addr, length);
+
+ if (ret != -1) {
+ heaptrack_munmap(addr, length);
+ }
+
+ return ret;
+}
+
#if HAVE_ALIGNED_ALLOC
void* aligned_alloc(size_t alignment, size_t size) noexcept
{
}
}
+void heaptrack_mmap(void* ptr, size_t length, int prot, int flags, int fd, off64_t offset)
+{
+ debugLog<VeryVerboseOutput>("heaptrack_mmap(%p, %zu, %d, %d, %d, %llu)",
+ ptr, length, prot, flags, fd, offset);
+
+ // TODO
+}
+
+void heaptrack_munmap(void* ptr, size_t length)
+{
+ debugLog<VeryVerboseOutput>("heaptrack_munmap(%p, %zu)",
+ ptr, length);
+
+ // TODO
+}
+
void heaptrack_invalidate_module_cache()
{
RecursionGuard guard;
void heaptrack_realloc(void* ptr_in, size_t size, void* ptr_out);
+void heaptrack_mmap(void* ptr, size_t length, int prot, int flags, int fd, off64_t offset);
+void heaptrack_munmap(void* ptr, size_t length);
+
void heaptrack_invalidate_module_cache();
#ifdef __cplusplus