函数插入仅适用于malloc不是免费的

时间:2013-02-21 09:49:17

标签: c malloc free dynamic-linking ld-preload

我在监视malloc时遇到了一个小问题,并且通过使用函数插入来释放。

当只为malloc执行函数插入时,它就像exepcted一样工作。然而,当试图自由插入时,它最终会循环;我看起来像是免费的,但是我只是不知道为什么。

这是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

祝你好运

Nyfiken

3 个答案:

答案 0 :(得分:1)

glibc使用__前缀提供真实符号(非弱)。因此,请尝试查找符号__malloc__free

为防止递归,请不要使用printf()或任何其他可能需要在包装器内分配内存的函数。

答案 1 :(得分:1)

printf可能正在调用free。当然,这意味着它也会执行内存分配,因此它提出了一个问题,为什么在malloc中看不到递归调用。可能printf正在调用callocrealloc等替代方案。

要插入您自己的代码,请使用宏来替换调用或单独链接代码,并使用链接器功能删除mallocfree,然后再链接到外部库(例如{ {1}}切换到Apple版本的ld)。

要插入所有代码,请从例程中删除-unexported_symbol。调用更简单的例程,例如printf。或者,使用静态标志来抑制递归:

fputs

(如果您有多个执行内存分配的线程或异常处理程序,则必须执行其他步骤。)

答案 2 :(得分:0)

我建议您使用宏来用您自己的函数替换malloc / free,而不是使用函数指针。

这样的事情应该这样做:

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

别忘了这样做:

 #undef malloc
 #undef free

在实际实施之前。

但请注意,从技术上讲,这不是“正确的” - 你不应该将宏用于标准库的一部分,所以如果它停止工作,请不要在这里呻吟 - 特别是,微软已经做了这样的东西用调试版本中的调试版本替换malloc