动态链接库的就基础知识
库有两种:动态和静态;动态是以.so 为后缀,静态是以.a为后缀;比如:libhello.o libhello.a
- 静态库是在写代码时调用的库函数,代码中调用库函数,在编译时会从库函数中copy 整个库函数到可执行文件;所以一旦连接成功(编译成功);可执行文件中就包含了
整个库函数的代码,以后在执行这个静态文件时就不用这个静态库函数了。
- 动态库函数:在linux中.so 为后缀,不是可执行程序的一部分,当执行可执行程序时动态加载这个动态链接库;而且这个动态链接库也是多个程序共享的,可以节省空间;linux 下进行连接的默认操作是首先连接动态连接。工作原理是动态库会在可执行程序内留下一个标记;指明当程序执行时,首先必须载入这个动态库
- linux 动态连接库,叫 共享对象:shared object ;就相当于windows下面的DLL
LINUX 的shared object 在我们日常写代码中可以自己写,把一些常用的工具都写成库函数,这样每次用时直接调用库函数,不用重复写代码。
Linux ldd 命令详解
- ldd 是一个linux的 shell 脚本,并不是一个可执行程序(C++编译后的可执行程序);用来打印共享库的依赖关系
which ldd /usr/bin/ldd - ldd 功能
查看 linux 可执行程序的依赖关系(dependency) :
ldd nginx-**
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c44200000)
liblog4cpp.so.3 => /home/a/lib64/liblog4cpp.so.3
libbdnet.so.0 => Not Found
3. ldd 的工作原理:
通过设置一系列的环境变量,比如:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE 等,当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。
(1) export LD_TRACE_LOADED_OBJECTS=1
(2) 再执行任何的程序,如ls等,看看程序的运行结果
(3). 恢复:
export -n LD_TRACE_LOADED_OBJECTS ;
Linux ldconfig 命令详解
- ldconfig 是动态链接库的管理命令;执行这个命令可以让动态链接库为系统所共享;、
主要是在默认搜目录【/lib 和 /usr/lib】以及动态库配置文件/etc/ld.so.conf
内所列的目录下,搜索出可共享的动态链接库(lib*.so),进而创建出动态装入程序(ld.so)
所需的连接和缓存文件,缓存文件默认为 /etc/ld.so.cache .
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
ll /etc/ld.so.conf.d/
total 36
-rw-r--r-- 1 root root 12 Mar 12 2010 homea-i386.conf
-rw-r--r-- 1 root root 14 Mar 12 2010 homea-x86_64.conf
-r--r--r-- 1 root root 324 Aug 19 2009 kernelcap-2.6.18-164.el5.co
ll /etc/ld.so.cache
-rw-r--r-- 1 root root 54372 Sep 6 05:19 /etc/ld.so.cache- 所以在修改了 动态链接库的.so 文件,或者先新安装的包里面依赖新的动态.so 文件,而这个.so没有在 默认的路径:/lib /usr/lib /etc/ld.so.conf.d/*.conf 里面则需要添加到其中的一个配置文件中;具体是哪一个要看代码中调用.so 路径了;然后执行一下 sudo ldconfig
Linux ldd ldconfig 实例分析
- 启动服务是报 .so 不存在:
/home/****/nginx: error while loading shared libraries:
libcopper.so: cannot open shared object file: No such file or directory
- libcopper.so 是linux的动态链接库,用ldd 查看一下是否找到
ldd /home、*****/nginx
libkagent.so => /home/a/lib64/libkagent.so (0x00002b61f71b6000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003fafe00000)
libcopper.so => not found- 跟正常服务的机器查看这个 shared object 的正常路径:
ldd /home/****/nginx|grep libcopper
libcopper.so => /usr/local/lib64/libcopper.so (0x00002ba3e6a4d000)
- 查询这个文件属于那个包
rpm -qf /usr/local/lib64/libcopper.so
copper-1.0.4-51.el5- 到有问题的机器上面安装这个包;然后sudo ldconfig 就OK拉
- 但是如果这个包已经安装,但是还是报错,那就是说明 /usr/lib /lib /etc/ld.so.conf 里面缺少某个路径;这是看代码和打包时需要的那个路径;添加进入
然后 sudo ldconfig 就OK拉
本文介绍了Linux动态链接库的基础知识,包括动态库与静态库的区别,重点解析了ldd命令用于查看可执行文件的依赖关系,以及ldconfig命令如何管理动态链接库,确保系统能够正确共享库文件。通过实例分析了动态链接库问题的排查和解决方法。

1655

被折叠的 条评论
为什么被折叠?



