我在监视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
答案 0 :(得分:1)
glibc使用__
前缀提供真实符号(非弱)。因此,请尝试查找符号__malloc
和__free
。
为防止递归,请不要使用printf()或任何其他可能需要在包装器内分配内存的函数。
答案 1 :(得分:1)
printf
可能正在调用free
。当然,这意味着它也会执行内存分配,因此它提出了一个问题,为什么在malloc
中看不到递归调用。可能printf
正在调用calloc
或realloc
等替代方案。
要插入您自己的代码,请使用宏来替换调用或单独链接代码,并使用链接器功能删除malloc
和free
,然后再链接到外部库(例如{ {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
。