背景:
在工作中,我习惯于在Solaris 10上工作。我们有系统管理员,他们知道自己在做什么,如果需要可以提供帮助。
我从源代码编译了apache,perl和mod_perl等内容,没有任何问题。
我已经获得了一个可以使用的redhat服务器并且遇到了问题。系统管理员此刻病了。
在构建软件时,我一直在遇到有关LD_LIBRARY_PATH的问题。出于测试目的,我正在编译到我的主目录,因为我没有root,或者在其他地方安装的权限。
我打算在/ opt下安装一个区域,就像我们在Solaris上一样,但我需要在sysadmin周围为我们创建它。
我的.bashrc没有为LD_LIBRARY_PATH提供任何内容,所以我一直在向它添加内容以构建内容(例如来自源代码的ffmpeg)。我一直在读这个,显然这不是要走的路,它不可靠或什么的。我无法访问ldconfig(权限被拒绝)。
现在排队:
在linux下构建应用程序的最佳方法是什么,以便它们不会破坏?在/etc/ld.so.conf.d/下创建条目?
任何人都可以简要概述一下LD_LIBRARY_PATH实际上做了什么吗?
答案 0 :(得分:0)
来自ld.so(8)
手册页:
LD_LIBRARY_PATH A colon-separated list of directories in which to search for ELF libraries at execution-time. Similar to the PATH environment variable.
但老实说,找一个管理员。如果需要,成为一个。哦,并建立包。
答案 1 :(得分:0)
LD_LIBRARY_PATH
使各个用户或各个进程可以在细粒度的基础上向搜索路径添加位置。 /etc/ld.so.conf应该用于系统范围的库路径设置,即部署应用程序。 (更好的是,您可以将其打包为rpm / deb并通过您的发行版常规包通道进行部署)
通常,用户可能会使用LD_LIBRARY_PATH
强制执行其程序以选择不同版本的库。通常,这对于支持调试或检测版本的库很有用,但您也可以使用它将自己的代码注入第三方代码。 (有时也可以将此用于恶意目的,如果你可以改变某人的bash配置文件以欺骗他们执行你的代码,而不会意识到这一点)。
如果某些应用程序在非默认位置安装“私有”库,也会设置LD_LIBRARY_PATH,即它们不会用于正常的动态链接但仍然存在。对于这样的场景,虽然我倾向于选择dlopen()
和朋友。
答案 2 :(得分:0)
设置LD_LIBRARY_PATH被认为是有害的,因为(除其他原因外):
LD_LIBRARY_PATH
动态关联。这意味着它可能会链接到某个特定版本的库,而该版本恰好位于您的LD_LIBRARY_PATH
中。 /home/user/lib/libtheora.so
。如果其他人尝试在没有LD_LIBRARY_PATH
的情况下运行它并且最终链接到默认版本,则会导致很多混淆,例如在/usr/lib/libtheora.so
。libc
对您LD_LIBRARY_PATH
感到狡猾,那么最终可能会造成损害您帐户的不良后果。正如ignacio所说,尽可能使用套餐。这避免了图书馆的噩梦。