【问题标题】:Is it possible to recursively populate missing shared objects when calling dlmopen(LM_ID_NEWLM)?调用 dlmopen(LM_ID_NEWLM) 时是否可以递归填充丢失的共享对象?
【发布时间】:2021-11-06 15:45:10
【问题描述】:

当使用dlmopen(LM_ID_NEWLM) 打开共享库时,新命名空间中没有现有的共享库,因此许多库会崩溃或至少给出未解析的符号。

是否可以使用 LM_ID_NEWLM 加载 .so 并拉入所有已链接到正在运行的应用程序的 .so?

我可以先走/proc/$$/maps,然后把他们拉进来,但似乎没有必要。

想法?

【问题讨论】:

    标签: linux gcc shared-libraries posix dynamic-linking


    【解决方案1】:

    不,没有 API 可以将共享库从默认名称空间复制到新名称空间。您可以按照您的建议使用/proc/self/maps,或者更好的是,使用dl_iterate_phdr/proc 可能并不总是被挂载)。

    附带说明,如果您的库由于未解析的符号而无法加载,则意味着应该对其进行修复以包含其依赖项。

    【讨论】:

    • 在尝试 dlsym() 符号之前是否会使用 RTLD_LAZY 加载所有库以避免未解决的符号问题?
    • yugr:事实证明,dlmopen() 命名空间不支持 RTLD_GLOBAL 因为这个错误:sourceware.org/bugzilla/show_bug.cgi?id=18684。这样做的结果是,使用 dl_iterate_phdr() 之类的东西将我需要的所有库加载到新的命名空间中根本不起作用——此外,dlmopen() 应该完成这项工作。我遇到的问题实际上是这个错误,而不是缺少库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多