我正在尝试破解malloc函数以首先调用我的malloc函数。一旦我的malloc函数在其中执行,我想调用标准的malloc。但是,我得到一个递归,因为它只是加载我定义的malloc。我该如何修复以下代码?
#include <dlfcn.h>
#include "stdio.h"
//#include "stdlib.h"
void *handle;
void *handle_malloc;
int (*loadprg)(void);
void * (*malloc_sysm)(size_t);
void init()
{
handle = dlopen ("/export/home/joshis1/Foxtel/temp/libloadmap.so", RTLD_LAZY);
if( handle == NULL)
{
puts(dlerror());
}
handle_malloc = dlopen ("/lib/libc.so.6", RTLD_LAZY);
if( handle_malloc == NULL)
{
puts("handle malloc error\r\n");
puts(dlerror());
}
}
#include "stdio.h"
void *malloc(int size)
{
printf("called..my malloc\r\n");
malloc_sysm = dlsym(handle_malloc,"malloc");
if ( dlerror() != NULL)
{
puts("malloc symbol not found..");
exit(1);
}
printf("This should call actual malloc now..\r\n");
return malloc_sysm(size);
}
int main()
{
int *t;
init();
printf("call load program now\r\n");
loadprg = dlsym(handle, "loadprg");
if( dlerror()!= NULL)
{
puts("Symbol load errror");
}
(*loadprg)();
printf("Close the handle now..\r\n");
dlclose(handle);
t = (int *) malloc (100);
dlclose(handle_malloc);
return 0;
}
输出是我定义的malloc()的递归。如何解决这个问题?
答案 0 :(得分:3)
要覆盖共享函数,您需要编译自己的共享库并通过LD_PRELOAD环境变量预加载它。
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
void *malloc(size_t size) {
printf("called..my malloc\r\n");
void *(*original_malloc)(size_t size);
// Find original malloc function
original_malloc = dlsym(RTLD_NEXT, "malloc");
if ( dlerror() != NULL)
{
puts("malloc symbol not found..");
exit(1);
}
printf("This should call actual malloc now..\r\n");
return (*original_malloc)(size);
}
$ gcc -Wall -fPIC -shared -o mymalloc.so mymalloc.c -ldl
$ LD_PRELOAD=./mymalloc.so ./prog
现在你的程序将使用来自预加载库的malloc。
答案 1 :(得分:1)
我一直在使用的标准方法是创建一个名为MALLOC
(或MYMALLOC
或其他)的宏,它可以满足您的需求。所有出现的malloc
当然,我必须用宏来代替,而且我可以理解这不是你想要的。
您还可以通过定义一个名为malloc
的宏(即拼写为原始malloc
)来实现您想要的功能。仅在编译您想要使用您的功能的源时。{{1}然后,宏将调用一个名为malloc
的函数,该函数应该在一个文件中声明,该文件在没有定义宏wrappingMalloc
的情况下编译,然后可以调用原始函数malloc
。如果这个makefile摆弄对你来说太过分了,你也可以通过调用malloc
调用原始函数(这样可以避免再次进入宏):
(malloc)
在C ++中,您可能会为您的类重载 #include <stdlib.h>
#include <stdio.h>
#define malloc(size) myMalloc(size)
void *myMalloc(size_t size) {
void *result;
printf("mallocing %ld bytes", size);
result = (malloc)(size);
printf(" at %p\n", result);
return result;
}
int main(int argc, char *argv[]) {
char *buffer;
buffer = malloc(10);
return 0;
}
运算符。
答案 2 :(得分:0)
我在代码中看不到问题。但为什么不将malloc_sysm = dlsym(handle_malloc,"malloc");
移到init()
函数中?