我使用的是ubuntu 12.04。每次启动bash终端和每次输入命令(并按enter)时,都会收到以下消息:
错误: ld.so: object‘/usr/lib/liblunar-日历-preload.so’不能被预加载:忽略。
这很奇怪。那么,环境变量LD_PRELOAD用于什么呢?现场后面是怎么回事?
谢谢。
发布于 2013-07-18 12:47:40
链接器考虑了一些环境变量。一个是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-08-28 10:16:54
如果要确保库被加载为当且仅当程序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-07-18 14:07:56
谢谢你的回复。我想我刚刚解决了这个问题。
由于LD_PRELOAD用于设置某些库的预加载,所以我使用LD_PRELOAD检查ld预加载的库,其中之一是“liblunar-日历-preload.so”,它在路径中不存在“/usr/lib/liblunar-日历-日历-preload.so”,但我发现类似的库“liblunar-日历-预加载-2.0.so”,这是前一个库的不同版本。
然后,我猜可能liblunar-日历-preload.so在系统更新时更新为2.0版本,使得LD_PRELOAD仍然是“/usr/lib/liblunar-日历-preload.so”。因此,预加载库名称没有更新到最新版本。
为了避免更改环境变量,我在路径"/usr/lib“下创建了一个符号链接
sudo ln -s liblunar-calendar-preload-2.0.so liblunar-calendar-preload.so
然后我重新启动bash,错误就消失了。
https://stackoverflow.com/questions/17723666
复制相似问题