Sim*_*her 7 libraries dependencies linker shared-library
我想删除链接器用于查找 .so 库以进行测试的一些路径。
我找到了一种添加库路径的方法:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library"
Run Code Online (Sandbox Code Playgroud)
是否有类似于LD_LIBRARY_PATH
我可以用来删除库路径的变量,例如/usr/local/lib
或/usr/lib
不在LD_LIBRARY_PATH
链接器中但由链接器拾取的路径?即如何忽略 /etc/ld.so.conf.d/ 中给出的路径?
这样做的原因是我正忙于创建一个程序,对于给定的可执行文件,它递归地查找库依赖项。我想看看是否可以通过查找所有依赖项,将这些依赖项复制到本地目录中,并制作本地运行的 bash 脚本来设置 LD_LIBRARY_PATH 然后运行可执行文件,从而使程序更具可移植性。我想测试在删除以前重要的库搜索路径后这个本地运行的可执行文件是否有效。
如果给定的共享库通过rpath功能嵌入了路径,您可能会对删除库路径感兴趣。这些是在链接器创建库时添加的。
您可以使用chrpath
例如删除(或更改)这些路径,
chrpath -d mylibraryfile.so
Run Code Online (Sandbox Code Playgroud)
从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'
Run Code Online (Sandbox Code Playgroud)
但是(针对评论),没有可移植的机制来告诉加载程序忽略现有路径。GNU ld 文档提供了所寻求内容的摘要,以及-rpath
选项描述中的顺序。这些项目总结了列表:
- 默认目录,通常
/lib
和/usr/lib
.- 对于 ELF 系统上的本机链接器,如果文件
/etc/ld.so.conf
存在,则为在该文件中找到的目录列表。
进一步阅读
归档时间: |
|
查看次数: |
23487 次 |
最近记录: |