LD_LIBRARY_PATH是否真的导致不一致?

时间:2013-08-13 10:12:50

标签: linux dynamic-linking

DTU计算中心的博客文章“ LD_LIBRARY_PATH – or: How to get yourself into trouble! ”声明:

  

3。不一致:这是最常见的问题。 LD_LIBRARY_PATH强制应用程序加载未链接的共享库,这很可能与原始版本不兼容。这可能是非常明显的,即应用程序崩溃,或者它可能导致错误的结果,如果拾取的库不完全执行原始版本的操作。特别是后者有时难以调试。

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

(因为,根据我的解释,Program Library HOWTO没有说出任何此类事情。)

或者作者是否意识到维护一致的库版本控制方案的概念,因此假设有一个未用于所讨论的库?

1 个答案:

答案 0 :(得分: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非常适合开发和测试,但不应该   由普通用户正常使用的安装过程修改;   参见``为什么LD_LIBRARY_PATH不好''   http://www.visi.com/~barr/ldpath.html解释原因。但   它仍然可用于开发或测试,以及解决方案   否则无法解决的问题。如果你不想   设置LD_LIBRARY_PATH环境变量,在Linux上你甚至可以   直接调用程序加载器并传递参数。例如,   以下将使用给定的PATH而不是内容   环境变量LD_LIBRARY_PATH,并运行给定的可执行文件:

     

/lib/ld-linux.so.2 --library-path PATH EXECUTABLE

     

只是在没有参数的情况下执行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.