有没有办法从它自己的C应用程序挂起malloc / free函数调用?
答案 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)
不确定这是否会被视为“覆盖”,但您可以通过使用宏来有效地更改调用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 */
}
答案 4 :(得分:1)
您可能需要LD_PRELOAD
机制来替换malloc
和free
。
答案 5 :(得分:0)
C不提供函数重载。所以你无法覆盖。
答案 6 :(得分:0)
根据您使用的平台,您可以从库中删除默认的malloc / free,并使用链接器或库管理器工具添加您自己的malloc / free。我建议你只在私人区域这样做,并确保你不能破坏原来的图书馆。
答案 7 :(得分:0)
在Windows平台上有一个Detour库。它基本上修补了汇编程序级别的任何给定函数。这允许拦截任何C库或OS调用,如CreateThread
,HeapAlloc
等。我使用此库来覆盖工作应用程序中的内存分配函数。
此库是特定于Windows的。在其他平台上,最有可能存在类似的库。