库部署与未使用的直接依赖关系

Sil*_*cer 6 linux qt dependencies shared-libraries ldd

我试图找出Qt Assistant需要部署的库.我ldd在Linux上用过这个.

我发现它ldd提供了-u"打印未使用的依赖项" 的选项.这听起来像是某种依赖(部署)不需要(总是).所以我再运行了两个ldd命令:

~$ ldd -u ~/Qt/5.10.0/gcc_64/bin/assistant 
Unused direct dependencies:
        /lib/x86_64-linux-gnu/libQt5Network.so.5
        /lib/x86_64-linux-gnu/libQt5Sql.so.5
        /lib/x86_64-linux-gnu/mesa/libGL.so.1
        /lib/x86_64-linux-gnu/libpthread.so.0
        /lib/x86_64-linux-gnu/libm.so.6
        /lib/x86_64-linux-gnu/libgcc_s.so.1

~$ ldd -r -u ~/Qt/5.10.0/gcc_64/bin/assistant 
Unused direct dependencies:
        /lib/x86_64-linux-gnu/libQt5Network.so.5
        /lib/x86_64-linux-gnu/mesa/libGL.so.1
        /lib/x86_64-linux-gnu/libpthread.so.0
        /lib/x86_64-linux-gnu/libm.so.6
        /lib/x86_64-linux-gnu/libgcc_s.so.1
Run Code Online (Sandbox Code Playgroud)

我试图找出发生了什么,但我并没有完全理解它.

我的问题是:

  • 什么是未使用的直接依赖(这听起来与我相矛盾)?
  • 是否有可能找出Qt Assistant实际上是否需要一个未使用的直接依赖(除了启动它并等待错误)?
  • 上述命令行之间究竟有什么区别?为什么
    第一个列表libQt5Sql却没有第二个列表?

Dev*_*das 1

由于 -u 开关,它正在打印。在 ldd 的手册页中

-u, --unused
          Print unused direct dependencies.  (Since glibc 2.3.4.)
Run Code Online (Sandbox Code Playgroud)

什么是未使用的直接依赖(这对我来说听起来很矛盾)?

恕我直言,您构建的二进制文件是不必要的。IE

gcc -L<LD_PATH> -Wall -o assistant assistant.c -lA -lB -lC
Run Code Online (Sandbox Code Playgroud)

它将列出所有 ABC 作为依赖项,但它们可能不会在二进制中实际使用。主要原因是 Makefile 中的通用 LDFLAGS。

是否有可能查明 Qt Assistant 是否确实需要未使用的直接依赖项(除了启动它并等待错误)?

不,我认为它只能在您调用特定函数时使用。您也有可能使用它而不会看到错误。即使您决定这样做。有一种疯狂的方法。列出所有调用的函数,然后检查需要哪些库。(不确定这一点,但我认为基于类似的逻辑 ldd 会打印这个。)根据手册页 ldd 可以运行二进制文件。所以基本上可以是你提到的场景。但并不广泛。

 Be aware,  however,  that  in some circumstances, some versions of
 ldd may attempt to obtain the dependency information by directly 
 executing  the program.  Thus, you should never employ ldd on an
 untrusted executable,
 since this may result in the execution  of  arbitrary  code.
Run Code Online (Sandbox Code Playgroud)

上述命令行到底有什么区别?为什么第一个列出了 libQt5Sql 而第二个没有列出?

差异是-r

       -r, --function-relocs
          Perform relocations for both data  objects  and  functions,  and
          report any missing objects or functions (ELF only).
Run Code Online (Sandbox Code Playgroud)

简而言之,它处理加载的库函数。建议在redhat上ldd -u -r针对bug使用。要了解有关重定位处理的更多信息,请阅读Oracle 文档。