【问题标题】:Can I link an existing .so to another .so so that ldd will show their association?我可以将现有的 .so 链接到另一个 .so 以便 ldd 显示它们的关联吗?
【发布时间】: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


【解决方案1】:

有没有办法修改 a.so 以便 ldd a.so 尝试解析 b.so ?

在大多数 UNIX 系统上,.so最终链接产品,无法进一步修改。

您也许可以使用 patchelf --add-needed b.so a.so,但只需 dlmopening b.so beforedlmopen a.so(由 Lorinczy Zsigmond 建议)可能是一个更简单的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多