首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ldd vs rpm -q -要求

ldd vs rpm -q -要求
EN

Unix & Linux用户
提问于 2021-01-12 16:02:23
回答 1查看 263关注 0票数 0

请有人解释一下为什么lddrpm -q --requires输出彼此不同?

我在查curl

代码语言:javascript
复制
[root@localhost ~]# rpm -qa curl
curl-7.29.0-59.el7_9.1.x86_64

[root@localhost ~]# ldd /usr/bin/curl
        linux-vdso.so.1 =>  (0x00007ffe07f09000)
        libcurl.so.4 => /lib64/libcurl.so.4 (0x00007fa3d7e2e000)
        libssl3.so => /lib64/libssl3.so (0x00007fa3d7bd1000)
        libsmime3.so => /lib64/libsmime3.so (0x00007fa3d79a9000)
        libnss3.so => /lib64/libnss3.so (0x00007fa3d7675000)
        libnssutil3.so => /lib64/libnssutil3.so (0x00007fa3d7445000)
        libplds4.so => /lib64/libplds4.so (0x00007fa3d7241000)
        libplc4.so => /lib64/libplc4.so (0x00007fa3d703c000)
        libnspr4.so => /lib64/libnspr4.so (0x00007fa3d6dfe000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa3d6be2000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa3d69de000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fa3d67c8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa3d63fa000)
        libidn.so.11 => /lib64/libidn.so.11 (0x00007fa3d61c7000)
        libssh2.so.1 => /lib64/libssh2.so.1 (0x00007fa3d5f9a000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fa3d5d4d000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fa3d5a64000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fa3d5831000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fa3d562d000)
        liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fa3d541e000)
        libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fa3d51c9000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fa3d4fc1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa3d8098000)
        libssl.so.10 => /lib64/libssl.so.10 (0x00007fa3d4d4f000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fa3d48ec000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fa3d46dc000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fa3d44d8000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fa3d42be000)
        libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007fa3d40a1000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fa3d3e7a000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fa3d3c43000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fa3d39e1000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fa3d37de000)

但是在运行rpm -q --requires curl-7.29.0-59.el7_9.1.x86_64时,我不会得到一些共享库,比如返回的/lib64/libk5crypto.so.3。AFAIK rpm -q --requires应该返回curl-7.29.0-59.el7_9.1.x86_64所需的所有功能,以便运行:

代码语言:javascript
复制
[root@localhost ~]# rpm -q --requires curl-7.29.0-59.el7_9.1.x86_64
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libcurl = 7.29.0-59.el7_9.1
libcurl.so.4()(64bit)
libdl.so.2()(64bit)
libnspr4.so()(64bit)
libnss3.so()(64bit)
libnssutil3.so()(64bit)
libplc4.so()(64bit)
libplds4.so()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libsmime3.so()(64bit)
libssl3.so()(64bit)
libz.so.1()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1

但是,当我在curl上运行strace时,我可以看到前面提到的共享库正在被“调用”:

代码语言:javascript
复制
[root@localhost ~]# strace curl 2>&1 |  grep open
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libcurl.so.4", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libssl3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libsmime3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnssutil3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libplds4.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libplc4.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnspr4.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libidn.so.11", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libssh2.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libgssapi_krb5.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libkrb5.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libk5crypto.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libcom_err.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/liblber-2.4.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libldap-2.4.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libssl.so.10", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libcrypto.so.10", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libkrb5support.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libkeyutils.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libsasl2.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libfreebl3.so", O_RDONLY|O_CLOEXEC) = 3
open("/etc/pki/tls/legacy-settings", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/root/.curlrc", O_RDONLY)         = -1 ENOENT (No such file or directory)

我错过了什么?

EN

回答 1

Unix & Linux用户

发布于 2021-01-12 16:16:36

ldd列出了所需的所有库,包括那些临时需要的库。RPM元数据只列出直接依赖项:

代码语言:javascript
复制
$ readelf -d /usr/bin/curl | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libssl3.so]
 0x0000000000000001 (NEEDED)             Shared library: [libsmime3.so]
 0x0000000000000001 (NEEDED)             Shared library: [libnss3.so]
 0x0000000000000001 (NEEDED)             Shared library: [libnssutil3.so]
 0x0000000000000001 (NEEDED)             Shared library: [libplds4.so]
 0x0000000000000001 (NEEDED)             Shared library: [libplc4.so]
 0x0000000000000001 (NEEDED)             Shared library: [libnspr4.so]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

上面的命令列出了二进制本身声明为依赖项的库。这与依赖项列表(以及版本符号,请参阅readelf -V)匹配。ldd显示的所有其他库都是传递依赖关系。

传递库依赖关系反映在传递的RPM依赖项中;例如,Kerberos库由libcurl.so.4提取,并出现在libcurl的S元数据中。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/628814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档