// 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 );;
}
*/