gpt4 book ai didi

c - 是否可以链接一个共享库(来自另一个共享库),而不使其符号全局可见?

转载 作者:行者123 更新时间:2023-12-01 14:38:21 26 4
gpt4 key购买 nike

假设我完全控制的libA 依赖于libC.so.2。同时,第三方 libB 依赖于 libC.so.1,我的 libA 可能与它共存于同一进程中。/p>

正常的动态链接不起作用,因为 libAlibB 将接收到 libC 中符号的错误实现。如何使 libAlibB 一起工作,同时对 libA 的构建管道进行最少的修改?

最佳答案

如果您可以从 libC.so.2 更改符号名称你可以使用 Implib.so的重命名功能。例如。改变所有 libC.so.2符号有 MYPREFIX_前缀:

$ cat mycallback.c
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C"
#endif
void *mycallback() {
void *h = dlmopen(LM_ID_NEWLM, "libxyz.so", RTLD_LAZY | RTLD_DEEPBIND);
if (h)
return h;
fprintf(stderr, "dlmopen failed: %s\n", dlerror());
exit(1);
}
$ implib-gen.py --dlopen-callback=mycallback --symbol_prefix=MYPREFIX_ libC.so.2
$ ... # Link your app with libC.so.2.tramp.S, libC.so.2.init.c and mycallback.c, keep libC.so.1 unchanged

libC.so.2 中的函数名称的 header 也需要更新(在 vim 中通常是一个简单的 s///)。

Implib.so 的工作原理是为有问题的库(在本例中为 libC.so.2 )中的每个符号生成一堆包装器,并将调用转发到内部的实际实现(通过 dlsym )。

关于c - 是否可以链接一个共享库(来自另一个共享库),而不使其符号全局可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55999667/

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