我正在按照这个答案覆盖对 C 库的 C 函数的调用。
我认为我做的一切都是正确的,但它不起作用:
我想覆盖“DibOpen”功能。这是我在运行应用程序时传递给 LD_PRELOAD 环境变量的库代码:
DIBSTATUS DibOpen(void **ctx, enum Board b)
{
printf("look at me, I wrapped\n");
static DIBSTATUS (*func)(void **, enum Board) = NULL;
if(!func)
func = dlsym(RTLD_NEXT, "DibOpen");
printf("Overridden!\n");
return func(pContextAddr, BoardType, BoardHdl);
}
nm lib.so | grep DibOpen
节目的输出
000000000001d711 T DibOpen
当我像这样运行我的程序时
LD_PRELOAD=libPreload.so ./program
我将我program
的与 -ldl 链接,但ldd program
没有显示到 libdl.so 的链接
它停止于
symbol lookup error: libPreload.so: undefined symbol: dlsym
. 我能做些什么来进一步调试呢?我的错误在哪里?