8

DTU 计算中心的博客文章“ LD_LIBRARY_PATH – 或:如何让自己陷入困境! ” 指出:

3.不一致:这是最常见的问题。LD_LIBRARY_PATH强制应用程序加载未链接到的共享库,这很可能与原始版本不兼容。这可能非常明显,即应用程序崩溃,或者可能导致错误的结果,如果拾取的库没有完全按照原始版本所做的那样。尤其是后者有时很难调试。

这是真的吗?LD_LIBRARY_PATH允许我们修改动态库的搜索路径,但它真的抑制了确保二进制兼容性的soname查找吗?

(因为,根据我的解释,程序库 HOWTO没有说任何这样的事情。)

还是作者不知道维护一致的库版本控制方案的概念,因此假设一个没有用于所讨论的库?

4

1 回答 1

5

我认为 LD_LIBRARY 应该只用于测试而不是最终安装,因为它允许在使用标准库位置之前使用指定的库。但是 linux 文档项目对 LD_LIBRARY_PATH 进行了说明,并且比我更清楚地说明了这一点。

3.3.1。LD_LIBRARY_PATH

您可以临时用不同的库替换此特定执行。在 Linux 中,环境变量 LD_LIBRARY_PATH 是一组以冒号分隔的目录,应首先在其中搜索库,然后是标准目录集;这在调试新库或出于特殊目的使用非标准库时很有用。环境变量 LD_PRELOAD 列出了具有覆盖标准集的函数的共享库,就像 /etc/ld.so.preload 一样。这些由加载程序/lib/ld-linux.so 实现。我应该注意,虽然 LD_LIBRARY_PATH 可以在许多类 Unix 系统上工作,但它并不适用于所有系统。例如,此功能在 HP-UX 上可用,但作为环境变量 SHLIB_PATH,而在 AIX 上,此功能是通过变量 LIBPATH(使用相同的语法,

LD_LIBRARY_PATH 便于开发和测试,但不应通过安装过程修改以供普通用户正常使用;有关原因的解释,请参见http://www.visi.com/~barr/ldpath.html上的“为什么 LD_LIBRARY_PATH 不好” 。但它对于开发或测试以及解决其他无法解决的问题仍然很有用。如果您不想设置 LD_LIBRARY_PATH 环境变量,在 Linux 上您甚至可以直接调用程序加载器并为其传递参数。例如,以下将使用给定的 PATH 而不是环境变量 LD_LIBRARY_PATH 的内容,并运行给定的可执行文件:

/lib/ld-linux.so.2 --library-path 路径可执行文件

只执行不带参数的 ld-linux.so 将为您提供更多使用它的帮助,但同样,不要将其用于正常使用 - 这些都是用于调试的。

2013 年 8 月 13 日取自:http ://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

文档内的链接是旧的,在这里找到了预期的文章:http: //xahlee.info/UnixResource_dir/_/ldpath.html

编辑

您可以覆盖程序在构建/安装期间链接到的库,因为ld.so在运行时查找要加载的库的顺序。在环境变量 LD_LIBRARY_PATH 中指定的位置找到的库将被加载,而不是指定默认路径的库(/lib/usr/lib

man 8 ld.so

   ld.so loads the shared libraries needed by a program, prepares the pro‐
   gram to run, and then runs it.  Unless  explicitly  specified  via  the
   -static  option to ld during compilation, all Linux programs are incom‐
   plete and require further linking at run time.

   The necessary shared libraries needed by the program are  searched  for
   in the following order

   o      Using      the      environment     variable     LD_LIBRARY_PATH
          (LD_AOUT_LIBRARY_PATH for a.out programs).  Except if  the  exe‐
          cutable is a setuid/setgid binary, in which case it is ignored.

   o      From  the  cache file /etc/ld.so.cache which contains a compiled
          list of candidate libraries previously found  in  the  augmented
          library  path.  Libraries  installed  in  hardware  capabilities
          directories (see below) are prefered to other libraries.

   o      In the default path /lib, and then /usr/lib.
于 2013-08-13T11:26:56.177 回答