【问题标题】:Binary file on Linux machine looking for libraries in /lib by defaultLinux 机器上的二进制文件默认在 /lib 中查找库
【发布时间】:2014-07-04 06:24:30
【问题描述】:

在我的 UNIX 机器上,我观察到二进制文件默认在 '/lib' 目录中查找依赖共享库,即使在 'PATH' 和 'LD_LIBRARY_PATH' 中未配置 '/lib' 目录变量。

我在下面看到库“libssl.so.4”是从“/lib”目录中找到的。

bash-3.00$ ldd openssl
        /lib/libcwait.so (0x00f86000)
        libssl.so.4 => /lib/libssl.so.4 (0x00408000)

我的“PATH”和“LD_LIBRARY_PATH”如下:

bash-3.00$ echo $LD_LIBRARY_PATH
:/opt/oracle/product/11.2.0/client32/lib:

bash-3.00$ echo $PATH
/opt/pure/releases/purify.hp.2003a.06.15.FixPack.0214/cache/opt/star-ncf-prod/ep_patch/usr/lib:/usr/ccs/bin:/usr/bin:/usr/ucb:/etc:/bin:.:/opt/ccm71/bin:/opt/oracle/product/11.2.0/client32/bin:/opt/tools/bin:/usr/local/bin

请让 mw 知道二进制文件是否默认引用“/lib”目录?

【问题讨论】:

    标签: linux ld


    【解决方案1】:

    阅读ld.so(8)、ldd(1) 和dlopen(3) 手册页和Drepper's paper: How To Write Shared Libraries

    您会看到“如果库依赖项不包含斜杠,则搜索它 对于“最后在/lib 然后/usr/lib

    这两个目录是内置的,即连接到动态链接器的代码中,例如/lib64/ld-linux-x86-64.so.2 在我的 Debian 系统上(我猜 - 但我不确定 - 在我的 Debian 上 /lib64/ 也已连接)。

    【讨论】:

      【解决方案2】:

      为了让可执行文件在运行时找到需要链接的库,必须配置系统以便可以找到这些库。可用方法:(至少执行以下操作之一)

      在动态链接到文件 /etc/ld.so.conf 期间添加要包含的库目录

      示例:/etc/ld.so.conf /usr/X11R6/lib /usr/lib ... /usr/lib/sane /usr/lib/mysql /opt/lib 将库路径添加到此文件,然后执行命令(以 root 身份) ldconfig 以配置链接器运行时绑定。 如果您正在为不同的环境进行开发,您可以使用“-f 文件名”标志来引用另一个配置文件。 请参阅命令 ldconfig 的手册页

      或

      将指定目录添加到库缓存中:(以 root 身份) ldconfig -n /opt/lib 其中 /opt/lib 是包含您的库 libctest.so 的目录 (在开发和添加当前目录时: ldconfig -n 。与 -L 链接。) 这不会将系统永久配置为包含此目录。系统重启后信息将丢失。

      或

      指定环境变量 LD_LIBRARY_PATH 以指向包含共享对象库的目录路径。这将向运行时加载程序指定库路径将在执行期间用于解决依赖关系。 (Linux/Solaris:LD_LIBRARY_PATH,SGI:LD_LIBRARYN32_PATH,AIX:LIBPATH,Mac OS X:DYLD_LIBRARY_PATH,HP-UX:SHLIB_PATH)

      示例(bash shell):导出 LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH 或添加到您的 ~/.bashrc 文件中:

      `...
       if [ -d /opt/lib ];
       then
           LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
       fi
       ...
       export LD_LIBRARY_PATH`
      

      这指示运行时加载程序查找由环境变量 LD_LIBRARY_PATH 描述的路径,以解析共享库。这将包括路径 /opt/lib。 使用的库路径应符合“Linux Standard Base”目录结构。

      【讨论】:

        猜你喜欢
        • 2020-04-14
        • 2018-09-16
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 2021-07-18
        • 1970-01-01
        相关资源
        最近更新 更多