我有两个共享库。 A lib 使用 dlopen 加载 lib B。
它们实现相同的 API 集。
我的客户端在同一系统上运行,当它尝试访问 API 时,它将加载哪个库?
或者这是无效的事情?我必须将 B 设为静态库。
我的目标是让客户端仅访问库 A。
最佳答案
您是否可以控制客户端(即您可以重新编译它)?如果是这样,你可以在链接时指定库A;那么 dlopen
B 就由 A 负责了。
如果您试图劫持 B 中对函数 foo
的调用,那么您的客户端正在尝试加载库 B。您可以使用 LD_PRELOAD
强制它加载改为库 A。然后客户端将调用 foo()
并由 A 应答,修改后 A 将能够将调用路由到 foo()@B
,更改和/或记录输入值和返回值。
您使用 LD_PRELOAD=B.so ./client
而不是 ./client
来调用您的客户端。
关于c - 两个共享库实现相同的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639985/