【问题标题】:ERROR: ld.so: object LD_PRELOAD cannot be preloaded: ignored错误:ld.so:无法预加载对象 LD_PRELOAD:忽略
【发布时间】:2013-07-17 09:58:24
【问题描述】:

我使用的是 ubuntu 12.04。每次我启动我的 bash 终端,每次我完成输入命令(并按回车键)时,我都会收到以下消息:

错误:ld.so:对象'/usr/lib/liblunar-calendar-preload.so'来自 LD_PRELOAD 无法预加载:忽略。

这很奇怪。 那么环境变量 LD_PRELOAD 是干什么用的呢?幕后发生了什么?

谢谢。

【问题讨论】:

  • 有些库只有在使用时才会加载。我认为使用 LD_PRELOAD 变量,您可以在程序开始运行之前尝试加载库,无论您是否使用它。
  • @hetepeperfan 每次输入命令时,我也会收到消息。应该怎么解释?
  • 您是否使用自定义构建的bash
  • @devnull 我使用的是默认 bash。即应用程序->附件->终端。
  • 这会给你一个错误吗? unset LD_PRELOAD; ls

标签: linux bash


【解决方案1】:

链接器会考虑一些环境变量。一个是LD_PRELOAD

来自man 8 ld-linux

LD_PRELOAD
          A whitespace-separated list of additional,  user-specified,  ELF
          shared  libraries  to  be loaded before all others.  This can be
          used  to  selectively  override  functions   in   other   shared
          libraries.   For  setuid/setgid  ELF binaries, only libraries in
          the standard search directories that are  also  setgid  will  be
          loaded.

因此,链接器将在加载其他库之前尝试加载 LD_PRELOAD 变量中列出的库。

如果在变量中列出了一个无法预加载的库,这可能是什么情况。查看设置了LD_PRELOAD.bashrc.bash_profile 环境,然后从变量中删除该库。

【讨论】:

    【解决方案2】:

    感谢您的回复。我想我刚刚解决了这个问题。

    由于 LD_PRELOAD 用于设置某些库的预加载,我检查了 ld 预加载的库 LD_PRELOAD,其中之一是“liblunar-calendar-preload.so”,它在路径“/usr/lib/liblunar”中不存在-calendar-preload.so”,但我找到了一个类似的库“liblunar-calendar-preload-2.0.so”,它是前者的不同版本。

    然后我猜可能 liblunar-calendar-preload.so 在系统更新时更新到了 2.0 版本,留下 LD_PRELOAD 仍然是“/usr/lib/liblunar-calendar-preload.so”。因此预加载库名称未更新为最新版本。

    为了避免改变环境变量,我在路径“/usr/lib”下创建了一个符号链接

    sudo ln -s liblunar-calendar-preload-2.0.so liblunar-calendar-preload.so
    

    然后我重新启动bash,错误消失了。

    【讨论】:

    • 但是对于您启动的每个程序,该库都会被加载,而变化很大,非常非常大,以至于程序不需要该库。因此,您可以在不需要时为 pc 创建额外的工作负载。
    • @hetepeperfan 感谢您指出这一点。但我不认为这是一个问题,因为该库仅在 bash shell 启动时加载,而不是在我启动每个程序之前加载。 liblunar-calendar-preload.so 由程序lunar-calendar-gtk 使用。如果不预加载 liblunar-calendar-preload.so,我认为 lunar-calendar-gtk 不会顺利运行。
    【解决方案3】:

    如果您想确保库被加载当且仅当程序lunar-calendar-gtk 启动时,您可以应用这个:

    您可以通过在命令前加上前缀来设置每个命令的环境变量:

    $ LD_PRELOAD="liblunar-calendar-preload.so" printenv "LD_PRELOAD"
    liblunar-calendar-preload.so
    $ printenv "LD_PRELOAD"
    $
    

    然后,您可以选择将其放入 shell 脚本中,并将 lunar-calendar-gtk 设置为该 shell 脚本的符号链接,替换原来的引用。这有效地确保了每次执行原始应用程序时都会加载库。

    您必须将原始 lunar-calendar-gtk 重命名为其他名称,这可能不会太吸引人,因为它可能会导致卸载和升级问题。但是,我发现它对以前版本的 Skype 很有用。

    【讨论】:

      【解决方案4】:

      表示您输入的路径出错。在您的LD_PRELOAD 命令中,修改路径,如错误提示:

      /usr/lib/liblunar-calendar-preload.so
      

      【讨论】:

        【解决方案5】:

        您可以查看/etc/ld.so.preload文件内容

        我通过以下方式修复它:

        echo "" > /etc/ld.so.preload

        【讨论】:

        • 这样,你就盲目地删除了该文件的所有内容。
        【解决方案6】:

        我在 Raspberry Pi 上安装 Citrix 客户端时遇到了此类错误。总之有一个文件/etc/ld.so.preload。该文件中列出了我的系统抱怨的库。我用 # 注释掉了它,系统停止了抱怨。

        【讨论】:

          【解决方案7】:

          当我执行以下命令时,一切都变得更好了。

          unset LD_PRELOAD
          

          【讨论】:

            猜你喜欢
            • 2012-01-18
            • 2016-02-26
            • 2019-11-19
            • 1970-01-01
            • 2019-05-18
            • 1970-01-01
            • 1970-01-01
            • 2012-12-23
            • 1970-01-01
            相关资源
            最近更新 更多