Linux 动态链接库(shared object)的基础知识

本文介绍了Linux动态链接库的基础知识,包括动态库与静态库的区别,重点解析了ldd命令用于查看可执行文件的依赖关系,以及ldconfig命令如何管理动态链接库,确保系统能够正确共享库文件。通过实例分析了动态链接库问题的排查和解决方法。

动态链接库的就基础知识

库有两种:动态和静态;动态是以.so 为后缀,静态是以.a为后缀;比如:libhello.o  libhello.a

  • 静态库是在写代码时调用的库函数,代码中调用库函数,在编译时会从库函数中copy 整个库函数到可执行文件;所以一旦连接成功(编译成功);可执行文件中就包含了

整个库函数的代码,以后在执行这个静态文件时就不用这个静态库函数了。

  • 动态库函数:在linux中.so 为后缀,不是可执行程序的一部分,当执行可执行程序时动态加载这个动态链接库;而且这个动态链接库也是多个程序共享的,可以节省空间;linux 下进行连接的默认操作是首先连接动态连接。工作原理是动态库会在可执行程序内留下一个标记;指明当程序执行时,首先必须载入这个动态库
  •  linux 动态连接库,叫 共享对象:shared object  ;就相当于windows下面的DLL

        LINUX 的shared object 在我们日常写代码中可以自己写,把一些常用的工具都写成库函数,这样每次用时直接调用库函数,不用重复写代码。

Linux  ldd 命令详解

  1. ldd 是一个linux的 shell 脚本,并不是一个可执行程序(C++编译后的可执行程序);用来打印共享库的依赖关系
     which ldd
    /usr/bin/ldd
  2. 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拉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值