有没有一种方法可以从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)
{
}
__libc_malloc
等函数,因此您可以从自己的malloc函数中调用它们,并仍然使用由glibc提供的malloc函数,并根据需要添加钩子逻辑。虽然不具备可移植性,但您需要使用dlsym
来实现更具可移植性的解决方案。 - Andreas Grapentin不确定这是否算作“覆盖”,但您可以通过使用宏有效地更改调用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
函数。
根据您使用的平台,您可能可以从库中删除默认的malloc/free,并使用链接器或图书管理员工具添加自己的malloc/free。我建议您只在私有区域中执行此操作,并确保不会损坏原始库。
CreateThread
,HeapAlloc
等。我在工作应用程序中使用了这个库来覆盖内存分配函数。C语言不支持函数重载,因此无法进行覆盖。
malloc
如何帮助替换它?除非您为非size_t
参数提供更好的匹配项,否则调用malloc
的所有内容仍将使用原始内容,即使是具有size_t
参数的调用也仍将使用原始内容。 - chris