ldd 必威手机官网:查看程序依赖库,ldconfig是一

Linux下动态链接库管理,linux动态链接库

一. ldd命令

ldd 查看程序重视库
ldd成效:用来查看程式运转所需的分享库,常用来缓慢解决程式因贫乏有些库文件而不可能运作的某个主题素材。
示范:查看test程序运维所信任的库:

/opt/app/todeav1/test$ldd test
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003996400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000)
libc.so.6 => /lib64/libc.so.6 (0x0000003995800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003995400000)

•第一列:程序须求信任什么库
•第二列: 系统提供的与程序须求的库所对应的库
•第三列:库加载的发端地址

经过地点的消息,大家得以拿到以下多少个音信:
1.经过对照第一列和第二列,大家能够深入分析程序供给依赖的库和连串实际提供的,是不是相相称
2.通过旁观第三列,大家得以精通在当下的库中的符号在相应的进度的地点空间中的早先地方

若是依据的有个别库找不到,通过那几个命令能够高速定位难点所在;

原理: ldd不是个可实行程式,而只是个shell脚本; ldd展现可举办模块的dependency的做事原理,其实质是经过ld-linux.so(elf动态库的装载器卡塔 尔(英语:State of Qatar)来完成的。ld-linux.so模块会先于executable模块程式专门的学业,并赢得调控权,由此当上述的那三个蒙受变量被装置时,ld-linux.so选拔了显示可举行模块的dependency。

二. ldconfig命令

ldconfig是一个动态链接库管理命令,其目标为了让动态链接库为系统所分享。

ldconfig的首要用场:

暗中认可搜寻/lilb和/usr/lib,以至安顿文件/etc/ld.so.conf内所列的目录下的库文件。

招来出可分享的动态链接库,库文件的格式为:lib***.so.**,进而制造出动态装入程序(ld.so)所需的接二连三和缓存文件。

缓存文件默以为/etc/ld.so.cache,该文件保留已排好序的动态链接库名字列表。

ldconfig平日在系统运营时运维,而当客商设置了叁个新的动态链接库时,就要求手工作运动行这么些命令。

ldconfig命令参数表明:

1、 -v或--verbose:用此选项时,ldconfig将突显正在扫描的目录及追寻到的动态链接库,还可能有它所开创的总是的名字.

2、-n :用此选项时,ldconfig仅扫描命令行钦定的目录,不扫描暗中同意目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录.

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 :此选项改造应用程序的根目录为ROOT(是调用chroot函数完成的).选拔此项时,系统默许的布置文件/etc/ld.so.conf,实际对应的为ROOT/etc/ld.so.conf.如用-r/usr/zzz时,展开配置文件/etc/ld.so.conf时,实际展开的是/usr/zzz/etc/ld.so.conf文件.用此选项,可以大大增添动态链接库处理的灵活性.

8、-l :平日处境下,ldconfig搜索动态链接库时将电动建设构造动态链接库的连接.接收此项时,将步入行家情势,供给手工业安装连接.常常顾客毫无此项.

9、-p或--print-cache :此选项提醒ldconfig打字与印刷出前段时间缓存文件所保存的持有分享库的名字.

10、-c FORMAT 或--format=FORMAT :此选项用于钦命缓存文件所使用的格式,共有两种:ld(老格式),new(新格式)和compat(宽容格式,此为暗许格式).

11、-V : 此选项打字与印刷出ldconfig的版本新闻,而后退出.

12、- 或 --help 或--usage : 那七个选项效能同样,都以让ldconfig打字与印刷出其帮忙音信,而后退出。

ldconfig须求专一的地点:

1、往/lib和/usr/lib里面加东西,是永不改过/etc/ld.so.conf文件的,不过增加完后内需调用下ldconfig,否则加多的library会找不到。

2、假设加上的library不在/lib和/usr/lib里面包车型大巴话,就势必要修正/etc/ld.so.conf文件,往该文件追加library所在的门道,然后也急需再行调用下ldconfig命令。举个例子在安装MySQL的时候,其库文件/usr/local/mysql/lib,就须求充实到/etc/ld.so.conf文件中。命令如下:

# echo"/usr/local/mysql/lib" >> /etc/ld.so.conf

#ldconfig -v | grep mysql

三. LD_LIBRARY_PATH

大器晚成经加上的library不在/lib或/usr/lib下,不过却未有权力操。写/etc/ld.so.conf文件的话,这个时候就要求往export里写叁个大局变量LD_LIBRARY_PATH,就足以了。

一、ldconfig

 

      ldconfig是三个动态链接库处理命令,为了让动态链接库为系统所共享,还需运转动态链接库的管住命令--ldconfig。 ldconfig 命令的用项,主借使在暗中认可搜寻目录(/lib和/usr/lib)甚至动态库配置文件/etc/ld.so.conf内所列的目录下,寻寻觅可分享的动态链接库(格式如前介绍,lib*.so*),进而创造出动态装入程序(ld.so)所需的连年和缓存文件,缓存文件默以为/etc/ld.so.cache,此文件保留已排好序的动态链接库名字列表。

 

      linux下的共享库机制采纳了就好像于高速缓存的体制,将库音讯保存在/etc/ld.so.cache里边,程序连接的时候首先从那么些文件之中找找,然后再到ld.so.conf的门径里边去详细找,那正是干吗修改了ld.so.conf要再度运维一下ldconfig的开始和结果。

 

ldconfig多少个须求在意的地点:

一,LINUX系统中动态链接库的开创与使用

1卡塔尔往/lib和/usr/lib里面加东西,是决不更正/etc/ld.so.conf的,可是造成之后要调一下ldconfig,不然那些library会找不到;

大家都知道,在WINDOWS系统中有多数的动态链接库(以.DLL为后缀的文本,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库差异,它里面包车型大巴函数并非实施顺序自身的生龙活虎有的,而是基于实施顺序须求按需装入,同有的时候间其实践代码可在两个施行顺序间分享,节省了半空中,升高了频率,具备相当高的油滑,获得更扩充程序猿和客户的讲究。那么,在LINUX系统中有无那样的函数库呢?

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手艺在 程序运转时被找到;

答案是一定的,LINUX的动态链接库不止有,而且不菲。在/lib目录下,就有那个以.so作后缀的文本,那就是LINUX系统应用的动态链接库,只然而与WINDOWS叫法差异,它叫so,即Shared Object,分享对象。(在LINUX下,静态函数库是以.a作后缀的) X-WINDOW作为LINUX下的正儿八经图形窗口分界面,它本身就动用了超级多的动态链接库(在/usr/X11Tiguan6/lib目录下),以福利程序间的分享,节省占用空间。著名的APACHE网页服务器,也使用了动态链接库,以便扩张程序功用。你只需将PHP动态链接库拷到其分享目录,矫正一下布署,APACHE就足以支撑PHP网页了。若是您愿意,能够和睦编写动态链接库,让APACHE帮忙你本身定义的网页格式。那就是动态链接的裨益。

3卡塔尔国要是想在此七个目录以外放lib,不过又不想在/etc/ld.so.conf中加东西(大概是从未权限加东西卡塔 尔(英语:State of Qatar)。那也得以,正是export三个大局变 量LD_LIBRARY_PATH,然后运路程序的时候就能够去那么些目录中找library。平日来说那只是黄金年代种如今的缓和方案,在未有权力或一时供给的时候利用;

1、LINUX下动态链接库的创办

4卡塔 尔(英语:State of Qatar)ldconfig做的这一个事物都与运路程序时有关,跟编写翻译时一点关系都并未有。编写翻译的时候依然该加-L就得加,不要混淆了;

在LINUX系统下,创立动态链接库是件再轻巧可是的业务。只要在编写翻译函数库源程序时累计-shared选项就可以,这样所生成的进行顺序即为动态链接库。从某种意义上来讲,动态链接库也是黄金时代种施行顺序。按日常准绳,程序名应带.so后缀。上面举个例证说说。

5卡塔 尔(英语:State of Qatar)由此可知,便是无论做了什么样有关library的改进后,最好都ldconfig一下,不然会现身部分意外的结果。不会花太多的岁月,可是会省比相当多的事。

自身打算编写七个函数,一个用以查询当前不久期getdate,几个用于查询当前时刻gettime,并将那八个函数存于动态链接库my.so中。为此,必要做以下几项专业。

ldconfig命令行用法如下:

1.1 编写客商接口文件datetime.h,内容如下(每行前边的数字为行号):

ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache]

1 /* datetime.h : 驰骋软件制作宗旨雨亦奇编写, 二〇〇二-06-28. */

[-c FORMAT] [--format=FORMAT] [-V] [-?|--help|--usage] path...

2

ldconfig可用的选项表达如下:

3 #ifndef __DATETIME_H

1卡塔 尔(阿拉伯语:قطر‎ -v或--verbose : 用此选项时,ldconfig将展现正在扫描的目录及搜寻到的动态链接库,还也是有它所创办的三番两回的名字;

4

2卡塔 尔(英语:State of Qatar)-n : 用此选项时,ldconfig仅扫描命令行钦点的目录,不扫描私下认可目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录;

5 #define __DATETIME_H

3卡塔尔-N : 此选项提醒ldconfig不重新建立缓存文件(/etc/ld.so.cache),若未用-X选项,ldconfig照常更新文件的连接;

6

4卡塔尔国-X : 此选项提示ldconfig不校正文件的总是,若未用-N选项,则缓存文件符合规律更新;

7 /* 日期结构*/

5卡塔 尔(阿拉伯语:قطر‎-f CONF : 此选项内定动态链接库的配备文件为CONF,系统默以为/etc/ld.so.conf;

8 typedef struct

6卡塔 尔(英语:State of Qatar)-C CACHE : 此选项钦命生成的缓存文件为CACHE,系统默许的是/etc/ld.so.cache,此文件贮存已排好序的可分享的动态链接库的列表;

9{

7卡塔尔-r ROOT : 此选项改造应用程序的根目录为ROOT(是调用chroot函数达成的),采纳此项时,系统暗中同意的布置文件 /etc/ld.so.conf,实际对应的为 ROOT/etc/ld.so.conf。如用-r /usr/zzz时,打开配置文件 /etc/ld.so.conf时,实际打开的是/usr/zzz/etc/ld.so.conf文件,用此选项,可以大大扩张动态链接库管理的灵活性;

10 int year;

8卡塔尔-l : 平日状态下,ldconfig寻找动态链接库时将自行建构动态链接库的总是,采用此项时,将跻身行家格局,需求手工业安装连接,日常顾客不用此项;

11 int mon;

9卡塔 尔(阿拉伯语:قطر‎-p或--print-cache : 此选项提醒ldconfig打印出这两天缓存文件所保存的具有分享库的名字;

12 int day;

10卡塔尔国-c FORMAT 或 --format=FORMAT : 此选项用于钦定缓存文件所选用的格式,共有二种: ld(老格式),new(新格式)和compat(宽容格式,此为默许格式);

13 }DATETYPE;

11卡塔 尔(英语:State of Qatar)-V : 此选项打字与印刷出ldconfig的版本音信,而后退出;

14

12卡塔尔国-? 或 --help 或 --usage : 那八个选取功能相似,都以让ldconfig打字与印刷出其接济音讯,而后退出。

15 /* 时间结构*/

二、ldd

16 typedef struct

职能:用来查阅程序运维所需的分享库,常用来缓慢解决程序因缺乏某些库文件而不可能运作的片段标题。

17 {

ldd命令原理

18 char hour;

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

19 char min;

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

20 char sec;

(2) 再进行其余的次序,如ls等,看看程序的运转结果

21 }TIMETYPE;

3、ldd展现可进行模块的dependency的专业原理,其实质是因此ld-linux.so(elf动态库的装载器卡塔尔国来落到实处的。我们理解,ld-linux.so模块会先于executable模块程序工作,并获取调控权,由此当上述的那贰个景况变量棉被服装置时,ld-linux.so选用了体现可举办模块的dependency。

22

4、实际上能够直接实行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这一定于ldd program卡塔 尔(英语:State of Qatar)。

23 /* 函数原型表达*/

24

25 #ifdef SHARED

26 int (*getdate)(DATETYPE *d);

27 #else

28 int getdate(DATETYPE *d);

29 #endif

30

31 #ifdef SHARED

32 int (*gettime)(TIMETYPE *t);

33 #else

34 int gettime(TIMETYPE *t);

35 #endif

36

37 #endif

38


其后生可畏客商接口文件中,先定义了日期与时间结构,接着定义一下函数的原型。动态函数与静态函数的原型表达不相同的是,动态函数应利用(*函数名)的样式,以便援用其指针。若要援引文件中的动态函数表达,客户应该定义一下SHARED宏,那样技巧动用。

1.2 编写getdate.c,源程序如下:


1 /* getdate.c : 驰骋软件制作中央雨亦奇编写, 2004-06-28. */

2

3 #include "time.h"

4 #include "datetime.h"

5

6 int getdate(DATETYPE *d)

7 {

8 long ti;

9 struct tm *tm;

10

11 time(&ti);

12 tm=localtime(&ti);

13 d->year=tm->tm_year+1900;

14 d->mon=tm->tm_mon+1;

15 d->day=tm->tm_mday;

16 }

17


在getdate函数中,先调用time得到以秒计的种类时间,再用localtime函数转变一下时间结构,最终调节获得不错的日子。

1.3 编写gettime.c,源程序如下:


1 /* gettime.c : 驰骋软件制作核心雨亦奇编写, 2004-06-28. */

2

3 #include "time.h"

4 #include "datetime.h"

5

6 int gettime(TIMETYPE *t)

7 {

8 long ti;

9 struct tm *tm;

10

11 time(&ti);

12 tm=localtime(&ti);

13 t->hour=tm->tm_hour;

14 t->min=tm->tm_min;

15 t->sec=tm->tm_sec;

16 }

17


gettime函数与getdate函数相像,先用time函数拿到以秒计的体系时间,再用localtime函数转换一下日子结构,最终回到当前的光阴(不需调度)。

1.4 编写维护文件makefile-lib,内容如下:

1 # makefile-lib : 纵横软件制作宗旨雨亦奇编写, 二零零一-06-28.

2

3 all : my.so

4

5 SRC = getdate.c gettime.c

6

7 TGT = $(SRC:.c=.o)

8

9 $(SRC) : datetime.h

10 @touch [email protected]

11

12 %.o : %.c

13 cc -c $?

14

15 # 动态函数库(my.so)生成

16 my.so : $(TGT)

17 cc -shared -o [email protected] $(TGT)

18


编写维护文件的目的,在于方便程序员维护程序,尤其是维护比较大的工程项目。一个素质良好的程序员应该学会熟练地编写维护文件makefile。定义了文件间的依赖关系后,一旦源文件发生变化,仅需make一下,其目标文件维护代码会自动执行,从而自动更新目标文件,减少了许多工作量。注意: 每行维护代码必须以TAB(跳格键)开始,不是的话make时将出错。

 

 

本维护文件第1行是注释行,以#号开头;文件第3行定义所有需要维护的函数库;第5行定义相关源程序文件;第7行定义目标文件;第9-10行说明所有源程序依赖于datetime.h头文件,并有相应维护代码,即touch一下,更新一下源文件的时间;第12-13行定义.o文件依赖于相应的.c文件,并指定了维护代码,即用cc编译一下;第16-17行定义共享库my.so依赖的目标文件,维护代码中用-shared编译选项,以生成动态链接库my.so。

 

 

1.5 运行make -f makefile-lib 命令

 

 

make运行后,动态链接库my.so就产生了,我们就可以在程序中调用了。如果想让系统所有用户都可以使用,则应以root用户登录系统,将这个库拷贝到/lib目录下(命令:cp my.so /lib),或者在/lib目录下建个符号连接即可(命令:ln -s `pwd`/my.so /lib)。

 

 

2、LINUX下动态链接库的使用

 

 

2.1 重要的dlfcn.h头文件

 

 

LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调用动态链接库的函数的原型。下面详细说明一下这些函数。

 

 

2.1.1dlerror

 

 

原型为: const char *dlerror(void);

 

 

当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

 

 

2.1.2dlopen

 

 

原型为: void *dlopen (const char *filename, int flag);

 

 

dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

 

 

filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件。

 

 

(1) 用户环境变量中的LD_LIBRARY值;

 

 

(2) 动态链接缓冲文件/etc/ld.so.cache

 

 

(3) 目录/lib,/usr/lib

 

 

flag表示在什么时候解决未定义的符号(调用)。取值有两个:

 

 

1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决。

 

 

2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误。

 

 

dlopen调用失败时,将返回NULL值,否则返回的是操作句柄。

 

 

2.1.3dlsym : 取函数执行地址

 

 

原型为: void *dlsym(void *handle, char *symbol);

 

 

dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。由此地址,可以带参数执行相应的函数。

 

 

如程序代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */

 

 

add=dlsym("xxx.so","add"); /* 打开xxx.so共享库,取add函数地址*/

 

 

add(89,369); /* 带两个参数89和369调用add函数*/

 

 

2.1.4dlclose : 关闭动态链接库

 

 

原型为: int dlclose (void *handle);

 

 

dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

 

 

2.2 在程序中使用动态链接库函数

 

 

2.2.1程序范例

 

 

下面的程序装载了动态链接库my.so,并用getdate,gettime取得当前日期与时间后输出。

 

 

----------------------------------------------------------------------

 

 

1 /************************************/

 

 

2 /* 文件名称: dy.c */

 

 

3 /* 功能描述: 动态链接库应用示范程序*/

本文由必威发布于必威-运维,转载请注明出处:ldd 必威手机官网:查看程序依赖库,ldconfig是一

相关阅读