【发布时间】:2021-11-07 08:42:32
【问题描述】:
我有两个现有的 .so 文件:
- a.so
- b.so
ldd 报告说他们都不知道对方,但a.so 在这个人为的例子中依赖于b.so 中的一个函数:
# ldd -r a.so
linux-vdso.so.1 => (0x00007ffe8e7bb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3d8830c000)
undefined symbol: b_test_func (./a.so)
# ldd -r b.so
linux-vdso.so.1 => (0x00007ffe8e7bb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3d8830c000)
# objdump -T b.so
0000000000fac7a0 g DF .text 0000000000000f80 b_test_func
由于a.so 没有针对b.so 编译,因此链接器使符号b_test_func 未解析,因此ldd 不会将b.so 列为依赖项,否则您会在其中看到类似b.so => /foo/b.so 的内容ldd a.so 输出。
我需要 dlmopen(LM_ID_NEWLM) a.so 进入一个新的命名空间,因此 a.so 必须依赖于 b.so,因为 dlmopen() 不支持 RTLD_GLOBAL,因为 this bug。 (请注意 dlopen(RTLD_GLOBAL) 确实有效)。
因此,我们需要 glibc 动态链接器通过使 a.so 指示它需要 b.so 来解析链接本身,以便它们可以在相同的命名空间中运行,并且 dlmopen() 将自动解析依赖关系。如果没有ldd 显示的链接,他们将不会使用彼此的共享符号,因此 dlsym() 将无法解析。
问题:
- 有没有办法修改
a.so,让ldd a.so尝试解析b.so? -
ldd显示的这个链接是什么,所以我可以正确引用它?
【问题讨论】:
-
这个序列怎么样:
bhandle= dlmopen(LM_ID_NEWLM,"b"); dlinfo(bhandle,RTLD_DI_LMID,&lmid); ahandle= dlmopen(lmid, "a");或者你可以创建一个 loader.so 依赖于“a”和“b”,所以你只需要 dlopen loader.so.
标签: gcc linker shared-libraries dynamic-linking dlopen