Linux机器上的二进制文件默认情况下在/ lib中查找库

时间:2014-07-04 06:24:31

标签: linux ld

在我的UNIX机器上,我发现默认情况下二进制文件正在查找“/lib”目录中的相关共享库,即使'PATH'中未配置'/ lib'目录LD_LIBRARY_PATH'变量。

我在下面看到库'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'目录?

2 个答案:

答案 0 :(得分:0)

为了使可执行文件能够在运行时找到要链接的所需库,必须配置系统以便可以找到库。可用方法:(至少做以下其中一项)

添加要在动态链接到文件/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

,请参见手册页

OR

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

OR

指定环境变量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):export 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标准基础"目录结构。

答案 1 :(得分:0)

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

您将看到“如果库依赖项不包含斜杠,则会搜索它        for { at last in /lib then /usr/lib

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