我使用的是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很有用.
感谢您的回复。我想我刚才已经解决了这个问题。
由于 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)
然后我刚刚保存了文件,一切正常,没有问题。