链接库
查询一个动态库的位置和版本
如果你不记得动态库的准确名字,可以通过以下几个方式来查找:
- 使用 find 命令
使用 find 命令可以扫描整个系统来查找动态库,例如:
find / -name "*libraryname*"
其中,libraryname 是动态库的模糊名称,使用通配符*可以匹配包含该名称的所有文件。
但需要注意的是,由于扫描整个系统可能非常慢,因此如果知道动态库应该在哪个目录下,最好直接到该目录下搜索。
- 使用 locate 命令
如果你的系统已经安装了 mlocate 工具,可以使用 locate 命令来快速查找文件。例如:
locate libraryname
该命令将查找包含 libraryname 的所有文件,并显示它们的路径。
需要注意的是,由于 mlocate 工具是基于数据库的,因此可能需要先使用 updatedb 命令更新数据库。
- 在 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。
- 使用 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 动态库所依赖的其它库的版本信息。
- 使用 objdump 命令
可以使用 objdump 命令查看一个动态库的符号表。符号表通常包含库的版本信息。
例如,查看 libssl.so 动态库的版本:
objdump -p /usr/lib/x86_64-linux-gnu/libssl.so | grep "SONAME"
这将输出动态库的版本信息,例如:
SONAME libssl.so.1.1
其中,SONAME 是动态库版本信息的标记。该信息通常位于动态库头部,可以通过 objdump 输出的方式查看。
注意,不是所有的动态库都包含版本信息。如果动态库不包含版本信息,则无法使用上述方法查看版本。