// RTLD_NEXT #define _GNU_SOURCE #define _POSIX_C_SOURCE 200809L #include /* NULL, size_t */ #include /* dprintf */ #include /* write */ #include /* 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 #include #include 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 );; } */