平台 - Linux
我有一个典型的要求,我需要为我的功能提供更高的优先级,然后是系统提供的功能。
假设我有第三方库或可执行文件。它调用许多系统函数,如strcpy或strlen等。我无法修改可执行文件/库,因为我无法访问代码。
现在我已经实现了自己的strlen或strcpy函数。当第三方库或可执行文件正在执行时,它应该调用我的函数而不是系统库函数。
有可能吗?如果是的话,有人可以指导我如何做到这一点。
LD_PRELOAD试用结果
根据这里的建议,我尝试使用LD_PRELOAD。我试图覆盖malloc函数。
#include <string.h>
void *malloc(int size)
{
void *ptr = NULL;
printf("Inside my malloc function\n");
ptr = malloc(size);
return ptr;
}
我把上面的代码放在一个c文件中并构建了mem.so文件并在命令下执行。
export LD_PRELOAD =。/ mem.so
所以现在我已经覆盖了malloc函数。
如果执行 ls 或清除命令,我会得到以下结果,这是合乎逻辑的。
Inside my malloc function
Inside my malloc function
Inside my malloc function
Inside my malloc function
Inside my malloc function
看起来我的重载malloc函数是递归调用的。我只需要一次通话。我怎样才能做到这一点。
答案 0 :(得分:5)
你的malloc需要调用真正的malloc。使用dlsym(3)
查找符号。
RTLD_NEXT找到下一个这样的引用。
#include <stdio.h>
#include <dlfcn.h>
void *malloc(size_t size)
{
static void * (*func)();
if(!func)
func = (void *(*)()) dlsym(RTLD_NEXT, "malloc");
printf("malloc(%d) is called\n", size);
return(func(size));
}