1

独自のmallocfreeを作成し、それらを共有ライブラリにコンパイルしました。私は自分のプログラムでそのライブラリを LD_PRELOAD します。このように、私のプログラムは常にカスタムのmallocfreeを使用しますか、そうでない場合もあります。gcc には malloc とfreeも組み込まれていると聞いたことがあります。gcc に付属の glibc がビルトインのmallocfreeを使用している可能性はありますか?

次に、プログラムを実行すると、 malloc/calloc呼び出しよりもfree関数呼び出しの方が頻繁に表示されることに気付きました(98 から 16)。私は自分でメモリ割り当てを行わないので (1 か所を除いて)、すべての割り当ては私が使用する標準ライブラリ関数によって行われます。また、プログラムで pthread を使用していることにも注意してください。知りたい場合は、私のプログラムは次のようになります。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>

#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;
}
4

1 に答える 1

2

LD_PRELOADオーバーライドなどに使用するmallocと、機能することが期待されます。これは、例えばDUMAがどのように機能するかです。

、、およびに加えてmalloc、必ず、、およびをオーバーライドしてください。さらに、C ++、、、およびをオーバーライドする必要がある場合があります。callocfreereallocmemalignvallocnewnew[]deletedelete[]

これを正しく行う方法の例については、LD_PRELOADメカニズムを使用した「malloc」のオーバーライドを参照してください。

于 2012-06-06T12:19:59.733 に答える