c - 函数插入仅适用于 malloc 而不是 free

标签 c malloc free dynamic-linking ld-preload

我在通过使用函数插入来监视 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/

相关文章:

c - undefined symbol 链接器 turbo c

c - C 编译器如何实现返回大型结构的函数?

c - cc1为什么叫cc1呢?

c - 为什么 free() 释放数据但保存 next_node 值?

c - malloc() 在无限循环中

C - 如何通过函数增加指向字符串的指针?

c - 如何通过malloc分配并打印字符数组?

c - 如何在 C 中管理动态字符串数组

c++ - 分配的内存块应该按什么顺序被释放?

c - 如果我们不使用 free() 来分配内存会发生什么