#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>

// Function pointers for original functions
void *(*originalMalloc)(size_t size) = NULL; // malloc
void (*originalFree)(void *ptr) = NULL; // free

// Shim for malloc
void *malloc(size_t size) {

    if (originalMalloc == NULL) {

        // Dynamically load symbol for next malloc() loader can find
        originalMalloc = dlsym(RTLD_NEXT, "malloc");

    }
    
    // Allocate pointer memory with originalMalloc()
    void *ptr = originalMalloc(size);

    // Print the pointer's memory address and size to stderr
    fprintf(stderr, "%p,%zu\n", ptr, size);

    return ptr;

}

// Shim for free
void free(void *ptr) {

    if (originalFree == NULL) {

        // Dynamically load symbol for next free() loader can find
        originalFree = dlsym(RTLD_NEXT, "free");

    }

    // Print the pointer's memory address to stderr
    fprintf(stderr, "%p,%d\n", ptr, -1);

    // Free pointer memory with originalFree()
    originalFree(ptr);

}