【问题标题】:LD_PRELOAD multiple interdependent librariesLD_PRELOAD 多个相互依赖的库
【发布时间】:2018-11-15 16:15:17
【问题描述】:

我有一个包含依赖树的库,即一些依赖项还有我想要预加载的其他依赖项。我该怎么做?

LD_PRELOAD \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libicudata.so.60 \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libicuuc.so.60 \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libicui18n.so.60 \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5 \
MyApp

LD_PRELOAD 调用包含已排序,因此依赖项列在依赖库之前。

链接器抛出以下错误:

ERROR: ld.so: object '/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

是否可以预加载库以按照正确的顺序完成依赖项?

【问题讨论】:

    标签: shared-libraries ld dynamic-library ld-preload


    【解决方案1】:

    这个错误:

    ld.so: object '/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5' \
    from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
    

    表示动态加载器尝试打开库失败。

    这个失败有几个可能的原因:

    1. 文件不存在(使用ls -L /opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5 确认存在
    2. 该文件用于错误的体系结构(例如,当 MyApp 为 64 位时,32 位 ELF,反之亦然)。使用file MyAppfile libQt5Core.so.5 确认它们匹配。
    3. 别的东西。也许MyAppnewlibuClibc 相关联,但libQt5Core.so.5 是使用GLIBC 构建的(反之亦然)。

    【讨论】:

    • 在我的情况下,无法预加载该库,因为它本身需要一个在 LD_LIBRARY_PATH 中“未找到”的动态库。不幸的是,我无法更改 LD_LIBRARY_PATH 以包含依赖项。
    • @danba 我很困惑:如果你知道libQt5Core 没有加载的原因,你为什么不这么说,为什么不将它需要的任何库添加到LD_PRELOAD列表?
    • 我试图解释共享库在问题中缺少依赖项。问题中的 LD_PRELOAD 列表确实包含所有依赖项,它们似乎没有被正确解释。
    • @danba 你关于为什么这不起作用的理论可能是不正确的。您如何知道“无法预加载该库,因为它本身需要一个“未找到”的动态库”?设置 LD_DEBUG=files,libs 可以提供更多信息。
    • 感谢LD_DEBUG=files,libs 的建议。原来那台机器上的环境很脏。顺便说一句,您的回答很好地总结了可能的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 2011-05-03
    • 2011-04-26
    • 2021-11-25
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多