Linux vs Solaris - 编译软件

时间:2011-02-24 12:27:29

标签: linux compilation ld

背景:

在工作中,我习惯于在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实际上做了什么吗?

3 个答案:

答案 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被认为是有害的,因为(除其他原因外):

  1. 您的计划会根据您的LD_LIBRARY_PATH动态关联。这意味着它可能会链接到某个特定版本的库,而该版本恰好位于您的LD_LIBRARY_PATH中。 /home/user/lib/libtheora.so。如果其他人尝试在没有LD_LIBRARY_PATH的情况下运行它并且最终链接到默认版本,则会导致很多混淆,例如在/usr/lib/libtheora.so
  2. 优先使用任何默认系统链接路径。这意味着,如果您最终libc对您LD_LIBRARY_PATH感到狡猾,那么最终可能会造成损害您帐户的不良后果。
  3. 正如ignacio所说,尽可能使用套餐。这避免了图书馆的噩梦。