Blesk

override.c

Stáhnout

// RTLD_NEXT
#define _GNU_SOURCE
#define _POSIX_C_SOURCE 200809L

#include <stddef.h>     /* NULL, size_t */
#include <stdio.h>      /* dprintf */
#include <unistd.h>     /* write */

#include <dlfcn.h>      /* dlsym */


typedef void *( *malloc_ptr )( size_t size );

void *malloc( size_t size )
{
    static malloc_ptr original = NULL;

    if ( !original )
        original = dlsym( RTLD_NEXT, "malloc" );

    void *result = original( size );

    write( 2, "malloc\n", 7 );

    /* V závislosti na implementaci nemusí fungovat.
     * (Pokud uvnitř ‹dprintf› volá ‹malloc›, dojde k zacyklení.)
     * Jedním z možných řešení je poskytnout vlastní implementaci
     * ‹dprintf›, například odkomentováním té na konci souboru. */

    // dprintf( 2, "malloc( %zu ) → %p\n", size, result );

    return result;
}


/*
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

int dprintf( int fd, const char *fmt, ... )
{
    va_list ap1;
    va_start( ap1, fmt );
    va_list ap2;
    va_copy( ap2, ap1 );

    int len = vsnprintf( NULL, 0, fmt, ap1 );
    va_end( ap1 );

    if ( len < 0 )
        return va_end( ap2 ), len;

    char buf[ len + 1 ];
    memset( buf, 0, len + 1 );
    vsnprintf( buf, sizeof buf, fmt, ap2 );
    va_end( ap2 );

    return write( fd, buf, len );;
}
*/