是否有办法从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)
{
}
不确定这是否算作"覆盖",但您可以通过使用宏有效地更改调用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
。
正如许多人已经提到的,这是非常特定于平台的。大多数"可移植"的方式是在这个问题的公认答案中描述的。移植到非posix平台需要找到合适的dlsym
替代品。
既然您提到了Linux/gcc,那么malloc的钩子可能最适合您。
根据您正在使用的平台,您可以从库中删除默认的malloc/free,并使用链接器或图书管理员工具添加您自己的malloc/free。我建议你只在私人区域这样做,并确保你不会破坏原始库。
Windows平台上有一个Detour库。它基本上在汇编程序级别修补任何给定的功能。这允许拦截任何C库或操作系统调用,如CreateThread
, HeapAlloc
等。我使用这个库在工作应用程序中重写内存分配函数。
这个库是Windows特有的。在其他平台上很可能也有类似的库。
C不提供函数重载。所以你不能重写。