deepwzh的技术笔记
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Cpp
  • c++ 模块
  • 类

    • 类
    • 友元
  • 开发工具

    • 开发工具
    • Vscode

      • Vscode
      • vscode 相关插件
  • 协程

    • 协程
    • test
  • 构建工具

    • 构建工具
    • Make
    • Cmake

      • Cmake
      • 常见问题
      • cmake 基本用法
      • cmake 集成 conan
      • cmake 生成器
      • cmake 库查找
  • 链接库

    • 链接库
    • 动态链接库
  • 编译器

    • 编译器
    • gcc

      • gcc
      • 常用选项
  • 包管理工具

    • 包管理工具
    • Canan

链接库

查询一个动态库的位置和版本

如果你不记得动态库的准确名字,可以通过以下几个方式来查找:

  1. 使用 find 命令

使用 find 命令可以扫描整个系统来查找动态库,例如:

find / -name "*libraryname*"

其中,libraryname 是动态库的模糊名称,使用通配符*可以匹配包含该名称的所有文件。

但需要注意的是,由于扫描整个系统可能非常慢,因此如果知道动态库应该在哪个目录下,最好直接到该目录下搜索。

  1. 使用 locate 命令

如果你的系统已经安装了 mlocate 工具,可以使用 locate 命令来快速查找文件。例如:

locate libraryname

该命令将查找包含 libraryname 的所有文件,并显示它们的路径。

需要注意的是,由于 mlocate 工具是基于数据库的,因此可能需要先使用 updatedb 命令更新数据库。

  1. 在 LD_LIBRARY_PATH 中查找

如果你已经设置了 LD_LIBRARY_PATH 环境变量,可以使用 which 命令来查找该环境变量中包含的所有动态库。例如:

echo $LD_LIBRARY_PATH
/usr/local/lib:/usr/lib

which -a libraryname

这将列出 LD_LIBRARY_PATH 所包含的所有目录中的 libraryname 动态库的路径。

需要注意的是,如果动态库没有被正确加载,可能需要重新设置 LD_LIBRARY_PATH 环境变量或将动态库放到操作系统默认搜索路径下。

要查看一个动态库的版本,可以使用命令 ldd 和 objdump。

  1. 使用 ldd 命令

可以使用 ldd 命令列出一个动态库的依赖库,并且开头几行将包含动态库的版本信息。

例如,查看 libssl.so 动态库的版本:

ldd --version
ldd (Ubuntu GLIBC 2.33-0ubuntu5) 2.33

第一行是 ldd 命令的版本信息。

ldd /usr/lib/x86_64-linux-gnu/libssl.so
        linux-vdso.so.1 (0x00007ffd9ec3e000)
        libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f9e896f9000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9e894f5000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9e892d7000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9e88e27000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9e89b32000)

第二行到第六行是 libssl.so 动态库所依赖的其它库的版本信息。

  1. 使用 objdump 命令

可以使用 objdump 命令查看一个动态库的符号表。符号表通常包含库的版本信息。

例如,查看 libssl.so 动态库的版本:

objdump -p /usr/lib/x86_64-linux-gnu/libssl.so | grep "SONAME"

这将输出动态库的版本信息,例如:

SONAME               libssl.so.1.1

其中,SONAME 是动态库版本信息的标记。该信息通常位于动态库头部,可以通过 objdump 输出的方式查看。

注意,不是所有的动态库都包含版本信息。如果动态库不包含版本信息,则无法使用上述方法查看版本。

子文档

  • 动态链接库
Next
动态链接库