我正在编写一个库,它通过运行程序来拦截对malloc
和在运行时的调用。free
LD_PRELOAD=mylib myexe
malloc
对和的调用可以free
很好地拦截。我的问题是 mylib 中还有另一个函数,我也想在LD_PRELOAD
使用时拦截它,我无法弄清楚为什么它不像调用malloc
and那样“正常工作” free
。
在 mylib.c 中:
void* malloc(size_t s)
{
return doMyMalloc();
}
void free(void* p)
{
doMyFree(p);
}
void otherThing(size_t)
{
doThing();
}
在 myexe.cpp 中:
#include <malloc.h>
extern "C" void otherThing(size_t); // Compile with -Wl,--unresolved-symbols=ignore-all
int main(int argc, char* argv[])
{
void* x = malloc(1000); // Successfully intercepted.
free(x); // Successfully intercepted.
otherThing(1); // Segfault.
}
我设法让它工作的一种方法是:
typedef void (*FUNC)(size_t);
FUNC otherThing = NULL;
int main(int argc, char* argv[])
{
otherThing = (FUNC)dlsym(RTLD_NEXT, "otherThing");
otherThing(1); // Successfully calls mylib's otherThing().
}
但我不想写所有这些代码;我不必为malloc
and这样做free
。LD_PRELOAD
如果缺少前缀,程序崩溃也没关系。