LD_PRELOADing malloc et gratuit

J’ai écrit mon propre malloc et libre et les ai compilés dans une bibliothèque partagée. Je LD_PRELOAD cette bibliothèque avec mon programme. De cette façon, mon programme utiliserait toujours mon malloc personnalisé et libre ou existe-t-il des cas où il n’en est pas ainsi? J’ai entendu dire que gcc a construit malloc et gratuit aussi. Est-il possible que la glibc fournie avec mon gcc utilise les commandes malloc et free intégrées?

Deuxièmement, je remarque que lorsque je lance mon programme, je vois l’appel de fonction gratuit plus souvent que les appels malloc / calloc (98 à 16). Je ne fais aucune allocation de mémoire moi-même (sauf à un endroit), donc toutes les allocations sont effectuées par les fonctions de bibliothèque standard que j’utilise. Et notez aussi que j’utilise pthread dans mon programme. Si vous voulez savoir, mon programme ressemble à ceci.

#include  #include  #include  #include  #include  #include  #define NUM_THREADS 8 pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; int sum; float total = 1; extern int __did_libc_start_main; void *PrintHello(void *threadid) { long tid; tid = (long)threadid; pthread_mutex_lock( &m ); sum++; total *= total + tid * 0.097891313423578; printf( "p%d, tid%d, total = %g, start = %d!\n", getpid(), tid, total, 0 ); pthread_mutex_unlock( &m ); printf("Hello World! It's me, thread #%ld!\n", tid); pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; char * p; char * m; fork(); p = (char*)mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); p[0] = 78; printf( "p = %p, p[0] = %d, pid = %d!\n", p, p[0], getpid() ); m = (char*)malloc( 80 ); printf( "m = %p!\n", m ); #if 1 for(t=0; t<NUM_THREADS; t++) { printf("In main: creating thread %ld\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); if (rc){ printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } } for(t=0; t<NUM_THREADS; t++) pthread_join(threads[t], NULL); printf( "\n\nTotal = %g\n\n", total ); /* Last thing that main() should do */ pthread_exit(NULL); #endif printf( "\n\n%d: Done without major problems\n\n", getpid() ); return 0; } 

Utiliser LD_PRELOAD pour remplacer malloc etc. devrait fonctionner; Voici comment fonctionne par exemple DUMA .

En plus des calloc malloc , calloc et free , veillez à ne pas remplacer realloc , memalign et valloc . En outre, vous devrez peut-être remplacer C ++ new , new[] , delete et delete[] .

Voir Remplacement de ‘malloc’ à l’aide du mécanisme LD_PRELOAD pour obtenir un exemple sur la façon de procéder.