LINUX的动态链接库不仅有,将库信息保存在/etc必

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动态库的装载器卡塔尔来促成的。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卡塔 尔(英语:State of Qatar)往/lib和/usr/lib内部加东西,是决不改革/etc/ld.so.conf的,不过成功之后要调一下ldconfig,不然那个library会找不到;

世家都通晓,在WINDOWS系统中有一些不清的动态链接库(以.DLL为后缀的公文,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库分化,它在那之中的函数实际不是施行顺序自个儿的生机勃勃有的,而是依照奉行顺序须要按需装入,同不时候其执行代码可在两个实施顺序间分享,节省了上空,进步了功能,具备极高的灵活性,获得更进一层多程序猿和客商的重申。那么,在LINUX系统中有无那样的函数库呢?

2卡塔 尔(英语:State of Qatar)想往下边五个目录以外加东西的时候,必要求校订/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/X11福特Explorer6/lib目录下),以福利程序间的分享,节省占用空间。知名的APACHE网页服务器,也运用了动态链接库,以便扩张程序成效。你只需将PHP动态链接库拷到其分享目录,改正一下安插,APACHE就足以支撑PHP网页了。假使您愿意,能够团结编排动态链接库,让APACHE帮衬你和睦定义的网页格式。那正是动态链接的受益。

3卡塔尔国假如想在此七个目录以外放lib,然而又不想在/etc/ld.so.conf中加东西(只怕是从未有过权力加东西卡塔尔。那也得以,正是export二个大局变 量LD_LIBRARY_PATH,然后运转程序的时候就能够去这一个目录中找library。平日来说那只是黄金年代种暂且的解决方案,在一直不权力或一时必要的时候使用;

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

4卡塔尔国ldconfig做的那几个东西都与运作程序时有关,跟编写翻译时一点事关都不曾。编写翻译的时候如故该加-L就得加,不要混淆了;

在LINUX系统下,创设动态链接库是件再轻松不过的职业。只要在编写翻译函数库源程序时增进-shared选项就能够,那样所生成的实施顺序即为动态链接库。从某种意义上的话,动态链接库也是少年老成种试行顺序。按通常法则,程序名应带.so后缀。下边举例说说。

5卡塔 尔(阿拉伯语:قطر‎不问可以知道,正是不管做了什么有关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卡塔尔-n : 用此选项时,ldconfig仅扫描命令行钦点的目录,不扫描暗许目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录;

5 #define __DATETIME_H

3卡塔 尔(英语:State of Qatar)-N : 此选项提醒ldconfig不重新建立缓存文件(/etc/ld.so.cache),若未用-X选项,ldconfig照常更新文件的一而再再而三;

6

4卡塔 尔(英语:State of Qatar)-X : 此选项提醒ldconfig不立异文件的总是,若未用-N选项,则缓存文件常常更新;

7 /* 日期结构*/

5卡塔 尔(阿拉伯语:قطر‎-f CONF : 此选项钦点动态链接库的布局文件为CONF,系统默感觉/etc/ld.so.conf;

8 typedef struct

6卡塔尔国-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卡塔 尔(英语:State of Qatar)-c FORMAT 或 --format=FORMAT : 此选项用于钦赐缓存文件所运用的格式,共有二种: ld(老格式),new(新格式)和compat(包容格式,此为默许格式);

13 }DATETYPE;

11卡塔尔-V : 此选项打字与印刷出ldconfig的版本消息,而后退出;

14

12卡塔 尔(英语:State of Qatar)-? 或 --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 : 驰骋软件制作主题雨亦奇编写, 二〇〇三-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 : 纵横软件制作宗旨雨亦奇编写, 二零零二-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 /* 功能描述: 动态链接库应用示范程序*/

本文由必威发布于必威-运维,转载请注明出处:LINUX的动态链接库不仅有,将库信息保存在/etc必

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。