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

Library deployment vs unused direct dependencies

我试图找出哪些库 Qt Assistant 需要部署。为此,我在 Linux 上使用了 ldd

我发现 ldd 提供了 -u 到 "print unused dependencies" 的选项。这听起来好像存在某种部署并不(总是)需要的依赖关系。所以我 运行 两个 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

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

我的问题是:

因为-u 开关正在打印。 在 ldd

的手册页中
-u, --unused
          Print unused direct dependencies.  (Since glibc 2.3.4.)

What is an unused direct dependency (this sounds contradictory to me)?

恕我直言 -> 您构建的二进制库不是必需的。 即

gcc -L<LD_PATH> -Wall -o assistant assistant.c -lA -lB -lC

它会将所有 A B C 列为依赖项,但实际上它们可能不会以二进制形式使用。 主要原因是 Makefile 中的通用 LDFLAGS。

Is it possible to find out if Qt Assistant actually requires an unused direct dependency (other then starting it and waiting for an error)?

NO 我认为因为它可能仅在您调用特定函数时使用。 您也有机会使用它而不会看到错误。 不过,如果您决定这样做。有一种疯狂的方式。列出所有调用的函数,然后检查需要哪些库。 (对此不确定,但我认为基于类似的逻辑 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.

What exactly is the difference between the above command lines? Why does the first list libQt5Sql but the second doesn't?

差异为 -r

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

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