首页 > 编程知识 正文

linux查看当前路径,linux的ldd命令

时间:2023-05-06 21:02:51 阅读:111964 作者:239

* * * * * * * * * * * * * * * * * *

前几天,我们在编译第三方开源库时,通过单击链接http://blog.csdn.net/u 010977122/article/details/52958330进行了打开

本文详细介绍了linux系统中动态库和静态库的原理。 在本文中,通过交叉编译进行交叉编译的动态库被复制到开发板上,并且不知道放在哪里。 我开始想是不是把它和可执行程序放在一起的目录里就可以了,但是在程序运行的时候没有找到。 然后,只要复制到/usr/lib下就可以执行了。 我觉得很奇怪程序是怎么找到动态库的。 后来在网上查了一下,才知道ldconfig在其中玩“诡计”。 整理了在网上检索到的介绍后,记录如下。

* * * * * * * * * * * * * * * * * *

一、ldconfig

ldconfig是动态链接库管理命令。 为了在系统上共享动态链接库,必须运行动态链接库的管理命令--ldconfig。 ldconfig命令的目的主要是在默认搜索目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf中描述的目录下共享的动态动态加载程序(ld.so ) )。缓存文件的默认值为/etc/ld.so.cache,其中包含有顺序的动态链接库名称列表。 要在系统上共享动态链接库,必须运行动态链接库的管理命令ldconfig。 此可执行文件存储在/sbin目录中。 ldconfig通常在系统启动时运行,但如果用户安装了新的动态链接库并修改了ld.so.conf,则必须手动运行此命令。

linux上共享库的工作方式类似于缓存,它将库信息保存在/etc/ld.so.cache中。 连接程序时,首先在此文件中查找,然后在ld.so.conf的路径中查找详细内容

ldconfig命令行用法如下:

ldconfig [-v|--verbose ] [-n ] [-n ] [-x ] [-f conf ] [-ccache ] [-r root ] [-l ] [-p|- print-cache ]

[-c格式] [--格式=格式] [-v ] [? |--help|--usage] path .

ldconfig可用的选项说明如下:

)1)在v或--verbose :上使用此选项时,ldconfig将显示正在扫描的目录、找到的动态链接库以及创建的链接的名称。

)2)-n :使用此选项时,ldconfig仅扫描命令行中指定的目录,并显示默认目录(/lib、/usr/lib )或配置文件/eed

)3)-N :此选项表示ldconfig不会重建缓存文件(/etc/ld.so.cache )。 如果不使用-X选项,ldconfig将照常更新文件中的连接。

)4)-X :此选项表示ldconfig不会更新文件中的连接。 如果不使用-N选项,缓存文件将成功更新。

)5)-f CONF :此选项将动态链接库的配置文件指定为CONF,系统默认值为/etc/ld.so.conf。

)6)-C CACHE :此选项将生成的缓存文件指定为CACHE。 系统默认值为/etc/ld.so.cache,该文件以排序方式存储可共享动态链接库的列表。

)7)-r ROOT :此选项将APP应用程序的根目录更改为ROOT。 这是通过调用chroot函数实现的。 选择此选项可使系统的缺省配置文件/etc/ld.so.conf实际上与根/etc/ld.so.conf (如-r )相对应的配置文件/etc/so.conf 使用此选项可以大大提高动态链接库管理的灵活性。

)8)-l :通常,当ldconfig搜索动态链接库时,会自动建立到动态链接库的连接。 如果选中此选项,将进入专家模式,必须手动设置连接。 普通用户不使用这个。

)9) p或--print-cache :此选项指示ldconfig打印存储在当前缓存文件中的所有共享库的名称。

(10 )-c FORMAT或--format=FORMAT :此选项指定用于缓存文件的格式。 l升有三种

d(老格式),new(新格式)和compat(兼容格式,此为默认格式).

(11) -V : 此选项打印出ldconfig的版本信息,而后退出.

(12) -? 或 --help 或--usage : 这三个选项作用相同,都是让ldconfig打印出其帮助信息,而后退出.

 

ldconfig几个需要注意的地方 
1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到 
2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到 
比如安装了一个MySQL到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时 就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在 程序运行时被找到。 
3. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变 量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时 候使用。 
4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。 
5. 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。

 

ldconfig提示“is not asymbolic link”的解决方法

在编译的时候会出现以下错误:

ldconfig 
ldconfig: /lib/libdb-4.7.so is not a symbolic link

这是因为正常情况下libdb-4.7.so是一个符号连接,而不是一个实体文件,因此只需要把它改成符号连接即可

mv libdb-4.7.so libdb-4.so.7

ln -s libdb-4.so.7 libdb-4.7.so

 

二、ldd

作用:用来查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题。

语法:

ldd(选项)(参数)
选项:

--version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何丢失的对象; -r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数; --help:显示帮助信息。
参数:

文件:指定可执行程序或者文库。


ldd命令原理介绍:

1、首先ldd不是一个可执行程序,而只是一个shell脚本

2、ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当
LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:
(1) export LD_TRACE_LOADED_OBJECTS=1
(2) 再执行任何的程序,如ls等,看看程序的运行结果

3、ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。

4、实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)

 

向大家推荐一个linux下系统命令帮助查阅的网站,网站是中文的,拯救了一大波英文不好的,而且介绍很齐全,排版很简洁:http://man.linuxde.net/

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。