是否有一种方法可以覆盖C中的malloc/free函数?



是否有办法从C应用程序中钩住malloc/free函数调用?

malloc()free()在标准库中定义;当链接代码时,链接器将只搜索库中尚未被先前遇到的目标代码解析的符号,并且编译生成的目标文件总是在任何库之前链接

因此,您可以通过在自己的代码中定义它来覆盖任何库函数,确保它具有正确的签名(相同的名称,相同的参数数量和类型以及相同的返回类型)。

可以。下面是一个示例程序。它与gcc 4.8.2一起编译和构建,但没有做任何有用的事情,因为实现没有功能。

#include <stdlib.h>
int main()
{
   int* ip = malloc(sizeof(int));
   double* dp = malloc(sizeof(double));
   free(ip);
   free(dp);
}
void* malloc(size_t s)
{
   return NULL;
}
void free(void* p)
{
}

不确定这是否算作"覆盖",但您可以通过使用宏有效地更改调用mallocfree的代码的行为:

#define malloc(x) my_malloc(x)
#define free(x) my_free(x)
void * my_malloc(size_t nbytes)
{
    /* Do your magic here! */
}
void my_free(void *p)
{
    /* Do your magic here! */
}
int main(void)
{
   int *p = malloc(sizeof(int) * 4); /* calls my_malloc */
   free(p);                          /* calls my_free   */
}

您可能需要LD_PRELOAD机制来代替mallocfree

正如许多人已经提到的,这是非常特定于平台的。大多数"可移植"的方式是在这个问题的公认答案中描述的。移植到非posix平台需要找到合适的dlsym替代品。

既然您提到了Linux/gcc,那么malloc的钩子可能最适合您。

根据您正在使用的平台,您可以从库中删除默认的malloc/free,并使用链接器或图书管理员工具添加您自己的malloc/free。我建议你只在私人区域这样做,并确保你不会破坏原始库。

Windows平台上有一个Detour库。它基本上在汇编程序级别修补任何给定的功能。这允许拦截任何C库或操作系统调用,如CreateThread, HeapAlloc等。我使用这个库在工作应用程序中重写内存分配函数。

这个库是Windows特有的。在其他平台上很可能也有类似的库。

C不提供函数重载。所以你不能重写。

相关内容

  • 没有找到相关文章

最新更新