Linux动态链接库加载失败一例

简介: 安装pacemaker rpm包后,遇到启动失败的情况,原因和动态链接库的加载有关,以下是详细。 问题 编译生成pacemaker 1.1.15的rpm包,然后在其它机器上安装pacemaker rpm包后,启动失败。

安装pacemaker rpm包后,遇到启动失败的情况,原因和动态链接库的加载有关,以下是详细。


问题

编译生成pacemaker 1.1.15的rpm包,然后在其它机器上安装pacemaker rpm包后,启动失败。

[root@srdsdevapp73 ~]# service pacemaker start
Starting Pacemaker Cluster Manager                         [FAILED] 

环境

  • CentOS 6.3 64bit

原因

通过strace发现pacemaker启动失败由于加载库libcoroipcc.so.4失败

[root@srdsdevapp73 ~]# strace -f service pacemaker start
...
[pid 19960] writev(2, [{"pacemakerd", 10}, {": ", 2}, {"error while loading shared libra"..., 36}, {": ", 2}, {"libcoroipcc.so.4", 16}, {": ", 2}, {"cannot open shared object file", 30}, {": 
... 

再用ldd检查pacemakerd,发现总共有3个库找不到

[root@srdsdevapp73 ~]# ldd /usr/sbin/pacemakerd
    linux-vdso.so.1 =>  (0x00007fffc4c9f000)
    libcrmcluster.so.4 => /usr/lib/libcrmcluster.so.4 (0x0000003cbac00000)
    libstonithd.so.2 => /usr/lib/libstonithd.so.2 (0x0000003cba400000)
    libcrmcommon.so.3 => /usr/lib/libcrmcommon.so.3 (0x0000003cb4c00000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003cb3c00000)
    libcpg.so.4 => /usr/lib64/libcpg.so.4 (0x00007f3f72199000)
    libcfg.so.6 => /usr/lib64/libcfg.so.6 (0x00007f3f71f95000)
    libcmap.so.4 => /usr/lib64/libcmap.so.4 (0x00007f3f71d8f000)
    libquorum.so.5 => /usr/lib64/libquorum.so.5 (0x00007f3f71b8b000)
    libgnutls.so.26 => /usr/lib64/libgnutls.so.26 (0x0000003cb8800000)
    libcorosync_common.so.4 => /usr/lib64/libcorosync_common.so.4 (0x00007f3f71988000)
    libplumb.so.2 => /usr/lib64/libplumb.so.2 (0x00007f3f71754000)
    libpils.so.2 => /usr/lib64/libpils.so.2 (0x00007f3f7154b000)
    libqb.so.0 => /usr/lib64/libqb.so.0 (0x00007f3f712e6000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003cb2c00000)
    libbz2.so.1 => /lib64/libbz2.so.1 (0x0000003cb7000000)
    libxslt.so.1 => /usr/lib64/libxslt.so.1 (0x0000003cb4800000)
    libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x0000003cb6000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003cb2400000)
    libuuid.so.1 => /lib64/libuuid.so.1 (0x0000003cb5000000)
    libpam.so.0 => /lib64/libpam.so.0 (0x0000003cb6c00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003cb3000000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003cb2800000)
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x0000003cb3800000)
    libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x0000003cb8400000)
    libcoroipcc.so.4 => not found
    libcfg.so.4 => not found
    libconfdb.so.4 => not found
    libtasn1.so.3 => /usr/lib64/libtasn1.so.3 (0x0000003cb7800000)
    libz.so.1 => /lib64/libz.so.1 (0x0000003cb3400000)
    libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x0000003cb7400000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003cb2000000)
    libaudit.so.1 => /lib64/libaudit.so.1 (0x0000003cb6400000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003cb5c00000)
    libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x0000003cb6800000)
    libfreebl3.so => /lib64/libfreebl3.so (0x0000003cb5800000) 

上面有一段"/usr/lib/libcrmcluster.so.4"比较奇怪,确认后发现文件不对,是以前安装的版本(不清楚当初怎么安装的了)。 正确的库位置应该是"/usr/lib64/libcrmcluster.so.4"。 将老版本的pacemaker删除后,一切正常

[root@srdsdevapp73 ~]# rm -f /usr/lib/libcrm*
[root@srdsdevapp73 ~]# rm -f /usr/lib/libstonithd.*
[root@srdsdevapp73 ~]# ldd /usr/sbin/pacemakerd
    linux-vdso.so.1 =>  (0x00007fff9a3ff000)
    libcrmcluster.so.4 => /usr/lib64/libcrmcluster.so.4 (0x00007f849a1fc000)
    libstonithd.so.2 => /usr/lib64/libstonithd.so.2 (0x00007f8499fea000)
    libcrmcommon.so.3 => /usr/lib64/libcrmcommon.so.3 (0x00007f8499d93000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003cb3c00000)
    libcpg.so.4 => /usr/lib64/libcpg.so.4 (0x00007f8499b8c000)
    libcfg.so.6 => /usr/lib64/libcfg.so.6 (0x00007f8499988000)
    libcmap.so.4 => /usr/lib64/libcmap.so.4 (0x00007f8499782000)
    libquorum.so.5 => /usr/lib64/libquorum.so.5 (0x00007f849957e000)
    libgnutls.so.26 => /usr/lib64/libgnutls.so.26 (0x0000003cb8800000)
    libcorosync_common.so.4 => /usr/lib64/libcorosync_common.so.4 (0x00007f849937b000)
    libplumb.so.2 => /usr/lib64/libplumb.so.2 (0x00007f8499147000)
    libpils.so.2 => /usr/lib64/libpils.so.2 (0x00007f8498f3e000)
    libqb.so.0 => /usr/lib64/libqb.so.0 (0x00007f8498cd9000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003cb2c00000)
    libbz2.so.1 => /lib64/libbz2.so.1 (0x0000003cb7000000)
    libxslt.so.1 => /usr/lib64/libxslt.so.1 (0x0000003cb4800000)
    libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x0000003cb6000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003cb2400000)
    libuuid.so.1 => /lib64/libuuid.so.1 (0x0000003cb5000000)
    libpam.so.0 => /lib64/libpam.so.0 (0x0000003cb6c00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003cb3000000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003cb2800000)
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x0000003cb3800000)
    libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x0000003cb8400000)
    libtasn1.so.3 => /usr/lib64/libtasn1.so.3 (0x0000003cb7800000)
    libz.so.1 => /lib64/libz.so.1 (0x0000003cb3400000)
    libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x0000003cb7400000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003cb2000000)
    libaudit.so.1 => /lib64/libaudit.so.1 (0x0000003cb6400000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003cb5c00000)
    libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x0000003cb6800000)
    libfreebl3.so => /lib64/libfreebl3.so (0x0000003cb5800000)
[root@srdsdevapp73 ~]# service pacemaker start
Starting Pacemaker Cluster Manager                         [  OK  ] 

总结

Linux下查找动态链接库的默认路径(未在/etc/ld.so.conf中设置,动态链接库加载时会优先查找/etc/ld.so.cache中库)的顺序如下,如果有同名的库文件挡在前面,可能导致动态链接库加载失败。

  1. /lib
  2. /usr/lib
  3. /lib64
  4. /usr/lib64
相关文章
|
4月前
|
Linux 编译器 vr&ar
Linux的动态库与静态库
静态库在编译时直接嵌入到最终的可执行文件中。
104 0
|
10月前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
1903 141
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
9月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
467 15
|
12月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
376 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
267 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
499 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
553 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
安全 Linux 开发者
在Linux中,内核模块是什么以及如何加载和卸载它们?
在Linux中,内核模块是什么以及如何加载和卸载它们?
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?