【问题标题】:Proper use of LD_LIBRARY_PATH or ldconfig for a software package正确使用软件包的 LD_LIBRARY_PATH 或 ldconfig
【发布时间】:2013-07-29 00:56:43
【问题描述】:

我知道使用ldconfigLD_LIBRARY_PATH 的一般基础知识,但我希望能得到一些大师的帮助。

我有一个可移植的软件包,它驻留在自己的目录中,并且有许多库的自己的版本。

有许多二进制文件和脚本从这个目录运行。

一些二进制文件(apache、php、postgres)也可能在系统上安装了单独的版本。

由于可能有两个版本的 php,如果系统无法确定使用 ldconfig 文件的“myapp”版本,则创建 /etc/ld.so.conf.d/myapp.conf 是不够的。

我正在寻找配置此类系统的最佳实践。最初设置软件包的人导出了LD_LIBRARY_PATH,以便系统上的所有应用程序都使用它。

我正在尝试仅隔离包目录中的应用程序。

使用的一些参数:

/mypack - 包含软件包的所有内容

/mypack/local/lib - 包含可能与系统不兼容的所需库

库示例:

/mypack/local/lib/libz.so.1 => /mypack/local/lib/libz.so.1.2.3
/lib/libz.so.1 => /lib/libz.so.1.2.3

即使版本相同,/mypack 中的版本可能与发行版不兼容,如果使用它会破坏系统

二进制示例: php 存在于 /mypack 和默认目录中 /mypack 中的 php 应使用 /mypack/local/lib 中的库,发行版应使用 /lib

关于linux库路径的一些问题: - 是否可以指定/etc/ld.so.conf.d/php.conf 使其仅影响/mypack 中的php 版本? - 可以根据可执行文件的位置指定库路径吗?也就是说,在运行时,如果可执行文件的路径在 /mypack 下,它可以自动使用那里的库吗? - 每个用户怎么样?部分/大部分系统在不同的用户帐户上运行。如果我能够为每个用户设置不同的库路径,那就可以解决了。

【问题讨论】:

  • 我认为典型的方法是使用包装脚本。包装脚本设置 LD_LIBRARY_PATH 的值,然后运行可执行文件。以 google-chrome 为例。
  • 如果这是任何人想出的唯一方法,我会接受的。我已经通过这样做在 CentOS 中运行了 Chrome 28,但由于涉及的不同可执行文件的数量,我试图避免它。

标签: linux ld


【解决方案1】:

如果其他人觉得这很有用,我最终在构建之前这样做了:

export LD_RUN_PATH='$ORIGIN/../lib'

这包括二进制文件本身中的库路径,相对于二进制文件的位置。如果您打算在 bash 脚本或构建文件中使用它,请确保使用 $ORIGIN 查找您的特定用法,因为在某些情况下您需要执行诸如 \$$ORIGIN、\$$ORIGIN 或 $$ 之类的操作ORIGIN 以便构建中涉及的不同实用程序正确转义美元符号。发现这个有用的信息让我不必更新大约 50 个单独的脚本,这些脚本作为批处理运行来构建我们的软件包。

【讨论】:

    【解决方案2】:

    通常的问题是 LD_LIBRARY_PATH 位于 ldconfig 提供的信息之前。如果您只想拥有一组备份库以在尚未拥有它们的系统上安装,请从 ldconfig 中提取当前的一组库并将它们添加到 LD_LIBRARY_PATH

    mytmp=/tmp/${USER}_junk$$
    ( for i in `/sbin/ldconfig -p | grep '=>' | awk '{ print $NF }'` ; do   dirname $i ; done ) | sort -r | uniq > ${mytmp}
    myld=""
    for j in `cat ${mytmp}` ; do myld=${j}:${myld} ; done
    rm -f ${mytmp}
    LD_LIBRARY_PATH=${myld}${LD_LIBRARY_PATH}:${SEP}/lib:${SEP}/lib/syslibs
    export LD_LIBRARY_PATH
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 2016-01-31
      • 1970-01-01
      • 2015-07-01
      • 2019-07-31
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      相关资源
      最近更新 更多