2

関数割り込みを使用して malloc と free を監視しているときに、小さな問題に遭遇しました。

ただ malloc の関数挿入を実行すると、期待どおりに動作します。ただし、無料で挿入しようとすると、ループに陥ります。free が再帰的に呼び出されているようですが、理由がわかりません。

これは、malloc および free 関数のコードです。(mod_malloc_free.c)

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>

void* malloc(size_t size) {

   static void* (*real_malloc)(size_t) = NULL;

   printf("%s\n", "inside shared malloc");

   if(!real_malloc)
        real_malloc = dlsym(RTLD_NEXT, "malloc");

   void * p = real_malloc(size);

   printf("malloc(%d) = %p\n",size, p );

   printf("%s\n", "returning from shared malloc");

   return p;

   }

void free(void* ap ) {

    static void (*real_free)(void*) = NULL;

  printf("inside shared free...\n");

  if(!real_free)
       real_free = dlsym(RTLD_NEXT, "free");

   printf("free = %p\n", ap);

   real_free(ap);

}

メインは単純に次のもので構成されています。

#include <stdio.h>
#include <malloc.h>

int main(void) {

    void * p = malloc(123);

    printf("p = %p\n",p );

    free(p);

    return 0;

}

次のようにコンパイル:

gcc -shared -ldl -fPIC mod_malloc_free.c -o libcustom.so

gcc -o smallMain -Wall smallMain.c

LD_PRELOAD=./libcustom.so ./smallMain

よろしくお願いします

ニーフィケン

4

3 に答える 3

1

__glibc はプレフィックス付きの実際のシンボル (弱いものではない) を提供します。そのため、シンボル__mallocとを検索してみてください__free

また、再帰を防ぐために、ラッパー内でメモリを割り当てる必要がある可能性がある printf() やその他の関数を使用しないでください。

于 2013-02-21T10:14:38.250 に答える
0

関数ポインターを使用する代わりに、マクロを使用して malloc/free を独自の関数に置き換えることをお勧めします。

このような何かがそれを行う必要があります:

 #ifdef REPLACE_MALLOC
 #define malloc(x) my_mallc(x)
 #define free(x)   my_free(x)
 #endif

することを忘れないでください:

 #undef malloc
 #undef free

実際の実装の前に。

ただし、技術的にはこれは「適切」ではないことに注意してください-標準ライブラリの一部であることにマクロを使用することは想定されていないため、マクロが機能しなくなった場合にここでうめき声を上げないでください-特に、Microsoftはすでにこのようなことを行っていますmallocデバッグビルドでデバッグバージョンに置き換えます。

于 2013-02-21T10:34:43.850 に答える