错误:ld.so:对象LD_PRELOAD无法预加载:忽略

lul*_*yon 33 linux bash

我使用的是ubuntu 12.04.每次我启动我的bash终端,每次输入命令(并按回车键),我收到此消息:

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

真奇怪.那么LD_PRELOAD用于什么环境变量?现场背后发生了什么?

谢谢.

het*_*fan 11

链接器将一些环境变量输入到acount中.一个是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.
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

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

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

$ LD_PRELOAD="liblunar-calendar-preload.so" printenv "LD_PRELOAD"
liblunar-calendar-preload.so
$ printenv "LD_PRELOAD"
$
Run Code Online (Sandbox Code Playgroud)

然后,您可以选择将其放在shell脚本中,并lunar-calendar-gtk为此shell脚本创建符号链接,替换原始引用.这有效地确保每次执行原始应用程序时都加载库.

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


lul*_*yon 5

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

由于 LD_PRELOAD 用于设置预加载的某些库,因此我使用 LD_PRELOAD 检查 ld 预加载的库,其中之一是“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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

对我有用的解决方案是使用 sudo vim 并进入/etc/ld.so.preload

然后我就删除了该行

/usr/local/lib/AppProtection/libAppProtection.so
Run Code Online (Sandbox Code Playgroud)

然后我刚刚保存了文件,一切正常,没有问题。