有没有办法覆盖C中的malloc / free函数?

时间:2014-07-22 17:00:51

标签: c malloc free

有没有办法从它自己的C应用程序挂起malloc / free函数调用?

8 个答案:

答案 0 :(得分:1)

正如许多人所提到的,这是非常特定于平台的。大多数"便携式"方式在this question的公认答案中描述。非posix平台的端口需要找到dlsym的适当替代。

既然你提到Linux / gcc,hooks for malloc可能会为你提供最好的服务。

答案 1 :(得分:1)

是的,你可以。这是一个示例程序。它使用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)
{
}

答案 2 :(得分:1)

malloc()free()在标准库中定义;链接代码时,链接器将仅搜索那些尚未被eailier遇到的目标代码解析的符号,并且编译生成的目标文件始终在之前任何库链接。

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

答案 3 :(得分:1)

不确定这是否会被视为“覆盖”,但您可以通过使用宏来有效地更改调用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   */
}

答案 4 :(得分:1)

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

答案 5 :(得分:0)

C不提供函数重载。所以你无法覆盖。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

在Windows平台上有一个Detour库。它基本上修补了汇编程序级别的任何给定函数。这允许拦截任何C库或OS调用,如CreateThreadHeapAlloc等。我使用此库来覆盖工作应用程序中的内存分配函数。

此库是特定于Windows的。在其他平台上,最有可能存在类似的库。