46

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

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

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

谢谢。

4

7 回答 7

18

链接器会考虑一些环境变量。一个是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其他库之前加载变量中列出的库。

在变量内部列出了一个无法预加载的库可能是什么情况。查看您的.bashrc.bash_profile环境中的LD_PRELOAD设置并从变量中删除该库。

于 2013-07-18T12:47:40.177 回答
9

如果你想确保当且仅当程序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 很有用。

于 2013-08-28T10:16:54.623 回答
4

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

由于 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,错误消失了。

于 2013-07-18T14:07:56.627 回答
2

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

我通过以下方式修复它:

回声“”> /etc/ld.so.preload

于 2020-02-19T03:59:47.640 回答
2

这意味着您输入的路径导致错误。在您的LD_PRELOAD命令中,修改路径,如错误提示:

/usr/lib/liblunar-calendar-preload.so
于 2017-03-04T05:17:52.150 回答
0

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

于 2021-11-05T00:59:39.300 回答
0

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

unset LD_PRELOAD
于 2021-11-12T02:26:20.837 回答