Вы можете сделать обертку и функцию «перезаписать» с LD_PRELOAD - аналогично примеру, показанному ранее.
LD_PRELOAD=/path.../lib_fake_malloc.so ./app
Но я рекомендую сделать это "немного" умнее, я имею в виду вызов dlsym один раз .
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>
void* malloc(size_t size)
{
static void* (*real_malloc)(size_t) = NULL;
if (!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");
void *p = real_malloc(size);
fprintf(stderr, "malloc(%d) = %p\n", size, p);
return p;
}
пример, который я нашел здесь: http://www.jayconrod.com/cgi/view_post.py?23 сообщение от Jay Conrod.
Но то, что я нашел действительно классным на этой странице, это то, что: GNU linker предоставляет полезную опцию, - wrap Когда я проверяю "man ld", есть следующий пример:
void *
__wrap_malloc (size_t c)
{
printf ("malloc called with %zu\n", c);
return __real_malloc (c);
}
Я согласен с ними, что это "тривиальный пример" :). Даже дслым не нужен.
Позвольте мне привести еще одну часть моей страницы "man ld":
--wrap=symbol
Use a wrapper function for symbol.
Any undefined reference to symbol will be resolved to "__wrap_symbol".
Any undefined reference to "__real_symbol" will be resolved to symbol.
Надеюсь, описание завершено и показывает, как использовать эти вещи.