我在通过使用函数插入来监视 malloc 和 free 时遇到了一个小问题。
当仅对 malloc 执行函数插入时,它按预期工作。然而,当尝试插入 free 时,它最终会陷入循环;我似乎递归地调用了 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
致以诚挚的问候
尼菲肯
最佳答案
glibc 提供带有 __
前缀的真实符号(非弱符号)。因此,尝试查找符号 __malloc
和 __free
。
为了防止递归,请勿使用 printf() 或任何其他可能需要在包装器内分配内存的函数。
关于c - 函数插入仅适用于 malloc 而不是 free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14999090/