gpt4 book ai didi

c - 使用 LD_PRELOAD 重载对共享库的 C 函数的调用

转载 作者:行者123 更新时间:2023-12-02 22:05:17 24 4
gpt4 key购买 nike

我正在关注 this answer覆盖对 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

我将我的 程序 与 -ldl 链接,但 ldd 程序 不显示指向 libdl.so 的链接

结束于

 symbol lookup error: libPreload.so: undefined symbol: dlsym

.我该怎么做才能进一步调试?我的错误在哪里?

最佳答案

当您创建共享库时(无论它是否会在 LD_PRELOAD 中使用),您需要命名需要解析其依赖项的所有库. (在某些情况下,dlopened 共享对象可以依赖可执行文件为其提供符号,但最好不要依赖它。)在这种情况下,您需要链接 libPreload.so 针对 libdl。在 Makefile-ese 中:

libPreload.so: x.o y.o z.o
$(CC) -shared -Wl,-z,defs -Wl,--as-needed -o $@ $^ -ldl

选项 -Wl,-z,defs 告诉链接器,如果共享库有未解析的 undefined symbol ,它应该发出错误,因此将来会更早地发现此类问题。选项 -Wl,--as-needed 告诉链接器不要记录对实际上不满足任何 undefined symbol 的库的依赖。默认情况下,这两个都应该打开,但由于历史原因,它们不是。

关于c - 使用 LD_PRELOAD 重载对共享库的 C 函数的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16217529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com