【发布时间】:2013-04-21 01:01:11
【问题描述】:
我正在编写一个库,通过使用LD_PRELOAD=mylib myexe 运行程序,在运行时拦截对malloc 和free 的调用。
对malloc 和free 的调用可以拦截。我的问题是 mylib 中还有另一个函数,当使用 LD_PRELOAD 时我也想拦截它,我无法弄清楚为什么它不像对 malloc 和 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 和free 这样做。
如果LD_PRELOAD 前缀丢失,程序崩溃也没关系。
【问题讨论】:
-
你是用 -lmylib 编译你的 exe 吗?
-
@auselen 好的,但问题是现在
malloc和free总是被“拦截”,即使我不使用LD_PRELOAD。我不希望这样,我希望它仅在使用LD_PRELOAD时才使用 mylib。 -
最简单的方法是将它们分成两个共享库。我建议你用笔/纸来起草你的问题。这些事情很容易变成鸡蛋问题。
-
分段错误的本质是什么?它发生在哪里?是
otherThing()中的崩溃,还是doThing()中的崩溃或从中调用的东西,或者是在调用otherThing()的代码中?我不确定它会告诉你什么,但我确信这些区别很重要。特别是,如果问题出在doThing()或它所调用的东西上,那么问题不直接在于预加载机制。如果您在没有-Wl,--unresolved-symbols=ignore-all选项的情况下进行编译,您会收到关于malloc()和free()的投诉,还是只有otherThing()?这很重要吗? -
为什么要忽略未解析的符号?