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

有没有办法覆盖C中的malloc/free函数?,c,malloc,free,C,Malloc,Free,有没有办法钩住C应用程序本身的malloc/free函数调用?C不提供函数重载。所以你不能覆盖 根据您使用的平台,您可以从库中删除默认的malloc/free,并使用链接器或库管理员工具添加您自己的。我建议您只在私人区域执行此操作,并确保不会损坏原始库。正如许多人已经提到的,这是非常特定于平台的。大多数“可移植”的方式都是在一个公认的答案中描述的。非posix平台的端口需要找到合适的dlsym替换件 既然您提到Linux/gcc,它可能会为您提供最好的服务。是的,您可以。下面是一个示例程序。它使

有没有办法钩住C应用程序本身的malloc/free函数调用?

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

根据您使用的平台,您可以从库中删除默认的malloc/free,并使用链接器或库管理员工具添加您自己的。我建议您只在私人区域执行此操作,并确保不会损坏原始库。

正如许多人已经提到的,这是非常特定于平台的。大多数“可移植”的方式都是在一个公认的答案中描述的。非posix平台的端口需要找到合适的dlsym替换件


既然您提到Linux/gcc,它可能会为您提供最好的服务。

是的,您可以。下面是一个示例程序。它使用GCC4.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)
{
}
#包括
int main()
{
int*ip=malloc(sizeof(int));
double*dp=malloc(sizeof(double));
免费(ip);
免费(dp);
}
void*malloc(尺寸)
{
返回NULL;
}
无空隙(空隙*p)
{
}
malloc()
free()
在标准库中定义;链接代码时,链接器将仅在库中搜索eailier遇到的目标代码尚未解析的符号,并且编译生成的目标文件始终在任何库之前链接


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

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


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

不确定这是否算作“覆盖”,但您可以使用宏有效地更改调用
malloc
free
的代码行为:

#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
机制来替换
malloc
free

而不是覆盖。但是如果您愿意,可以将其包装在自己的函数中。这是非常特定于平台的,您应该指定您使用的平台/工具链。显然,您不能过度编写它。因为C不支持函数overloading.@Sujith无论它在哪里,如果你使用C语言,你就不能这样做。规则是调用malloc的代码和调用free的代码应该在同一个位置。因此,将你的库内存公开为不透明句柄,并用你自己库中的代码管理它们,类似于fopen/fclose for FILE。重载与接管它无关。@CHRIS是真的。但是我认为,我们可以在C++中重载新的,我们不能在C中重载MalOC。如何重载<代码> MalOC 有助于替换它吗?所有调用<代码> MalOC 的所有东西仍然使用原件,除非你为非<代码> SIEZYTHT < /C>参数提供更好的匹配,甚至是使用<代码> SiZeStt 参数仍然使用原件。快!告诉DLMALLC、TCMalOC、JEMALOC和其他许多人他们不能这样做!过载不是与C或C++中的重写相同的东西,并且可以通过定义它来覆盖任何库代码。ls允许用户代码覆盖它们。(请参阅我在上面的评论中链接的问题)危险且不必要。编辑:对于gnu/linux,至少=)您不需要走那么远-只需定义一个同名函数,链接器就不会在库中搜索它。对于gnu/linux,glibc还导出
\u libc\u malloc
和好友,这样您就可以从malloc调用它们,并且仍然使用glibc提供的malloc并添加您的好友根据需要确定逻辑。虽然不是可移植的,但您需要
dlsym
来获得更具可移植性的解决方案。终于有人知道他们在说什么了。也就是说,代码是运行的,而不是分配的。@AndreasGrapentin:这取决于您的需要。您可以分配一个大的静态数组,并将其作为一个堆使用您自己的allo阳离子算法,则不存在操作系统依赖关系。这就是大多数无操作系统的嵌入式系统的基本原理。@Clifford这在应用程序代码中几乎从来都不是一个好主意。=)嵌入式系统当然是一个完全不同的故事。@AndreasGraphentin:是的,但这是一个关于GCC/Linux的问题这一事实尚未得到证实d在问题中,只是后来的评论,我们不知道为什么会问这个问题——因此“这取决于你的需要”“资格。至少在Linux中,你会失去很大的灵活性和功能性,比如虚拟内存,而且一个大的静态分配可能会影响其他被迫交换的进程的性能-但是这个想法是存在的(我是一名嵌入式系统开发人员)。这与问题非常接近,尽管OP要求使用malloc hook,而不是重新实现。(+1)@AndreasGrapentin:我不清楚他所说的钩子是什么意思,但这似乎与书名所暗示的问题略有不同。他似乎在问两个问题。你能再补充一点信息吗,这样读者就不需要谷歌
LD_PRELOAD
?顺便说一句,这是一个非常有趣的技巧,我以前从未见过使用它。