ldd
ldd(/usr/bin/ldd)本质是一个shell脚本,并不是一个二进制的可执行程序。
ldd可以列出一个程序运行所依赖的动态链接库(so文件)。
由于制作二进制程序的过程中经常需要判断需要哪些共享库的支持,所以要使用ldd找出所需的依赖并添加至目标系统中,以确保程序可以在独立的目标系统内可靠的运行。
eg.
# ldd /usr/bin/ls linux-vdso.so.1 => (0x00007ffc62b26000) libachk.so => /lib64/libachk.so (0x00007f1159b5f000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f1159938000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f1159733000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f115952a000) libc.so.6 => /lib64/libc.so.6 (0x00007f1159159000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f1158f55000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1158d39000) librt.so.1 => /lib64/librt.so.1 (0x00007f1158b31000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f11588cf000) /lib64/ld-linux-x86-64.so.2 (0x00007f1159f82000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f11586ca000)
"=>"左边的表示该程序需要连接的so 名称,右边表示由 Linux 的共享库系统找到的对应的共享库在文件系统中的具体位置。
默认情况下,/etc/ld.so.conf 文件中包含有默认的共享库搜索路径。
通常情况下,许多开放源代码的程序或函数库都会默认将自己安装到 /usr/local 目录下的相应位置(如:/usr/local/bin 或 /usr/local/lib),以便与系统自身的程序或函数库相区别。
许多 Linux 系统的 /etc/ld.so.conf 文件中默认不包含 /usr/local/lib。因此往往会出现已经安装了共享库,但是却无法找到共享库的情况。
具体解决办法如下:
检查 /etc/ld.so.conf 文件,如果其中缺少 /usr/local/lib 目录,就添加进去;
注意:在修改了 /etc/ld.so.conf文件或者在系统中安装了新的函数库之后,需要运行一个命令:ldconfig,该命令用来刷新系统的共享库缓存,即 /etc/ld.so.cache 文件;
为了减少共享库系统的库搜索时间,共享库系统维护了一个共享库 so 名称的缓存文件/etc/ld.so.cache。因此在安装新的共享库之后,一定要运行 ldconfig 刷新该缓存。