如何更改单个终端实例的共享库(.so 文件)的路径

如何更改单个终端实例的共享库(.so 文件)的路径

我想删除链接器用于查找 .so 库的一些路径以进行测试。

我找到了添加库路径的方法:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library"

是否有一个与LD_LIBRARY_PATH我可以用来删除库路径类似的变量,例如/usr/local/lib/usr/lib不在链接器中LD_LIBRARY_PATH但由链接器拾取的路径?即如何忽略 /etc/ld.so.conf.d/ 中给出的路径?

原因是我正忙于创建一个程序,对于给定的可执行文件,它会递归地查找库依赖项。我想看看是否可以通过查找程序的所有依赖项、将这些依赖项复制到本地目录并制作本地运行的 bash 脚本来设置 LD_LIBRARY_PATH 然后运行可执行文件,从而使程序更具可移植性。我想测试在删除以前重要的库搜索路径后此本地运行可执行文件是否有效。

答案1

您可能会感兴趣去除库路径(如果给定)共享库通过以下方式嵌入了路径路径特征。这些是在链接器创建库时添加的。

您可以使用删除(或更改)这些路径chrpath,例如,

chrpath -d mylibraryfile.so

从变量中删除路径名LD_LIBRARY_PATH也是一个可能感兴趣的领域;您可以通过字符串替换并重新导出变量来做到这一点。然而,这个问题似乎与此无关。没有任何变量可以抵消LD_LIBRARY_PATH

为了看到库依赖项,提到/etc/ld.so.conf.d/听起来好像平台仅限于 Linux。您可以使用ldd列出依赖项。除了 OSX,所有 BSD 也支持ldd。这是我为此目的使用的脚本之一:

#!/bin/sh
# $Id: ldd-path,v 1.1 2007/07/09 19:30:28 tom Exp $
# Edit the output of ldd for the given parameters, yielding only the
# absolute pathnames.
ldd $* | sed \
        -e 's/([^)]*)//g' \
        -e 's/^.*=>//' \
        -e 's/[         ][      ]*//g' \
        -e '/^$/d'

但是(针对评论),没有可移植的机制来告诉加载程序忽略现有路径。GNU ld 文档给出了所寻找内容的摘要,以及描述中的顺序-rpath选项。列表的最后一项是:

  • 默认目录,通常是/lib/usr/lib.
  • 对于 ELF 系统上的本机链接器,如果文件/etc/ld.so.conf存在,则在该文件中找到的目录列表。

进一步阅读

相关内容