我试图找出部署所需的库Qt Assistant
。我在Linux上使用了ldd
。
我发现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
我试图找出发生了什么,但我还没有完全理解它。
我的问题是:
Qt Assistant
是否确实需要未使用
直接依赖(除了启动它并等待错误)?libQt5Sql
但是第二个列表没有?答案 0 :(得分:1)
由于-u开关打印。 在ldd的手册页中
-u, --unused
Print unused direct dependencies. (Since glibc 2.3.4.)
什么是未使用的直接依赖(这听起来与我相矛盾)?
是恕我直言 - >您构建二进制文件的库是不必要的。 即。
gcc -L<LD_PATH> -Wall -o assistant assistant.c -lA -lB -lC
它会将所有A B C列为依赖项,但它们实际上可能不会用于二进制文件。 主要原因是Makefile中的通用LDFLAGS。
是否有可能找出Qt Assistant是否真的需要未使用 直接依赖(除了启动它并等待错误)?
不,我认为因为只有在您调用特定功能时才可以使用它。 也有可能你可以使用这个看不到的错误。 如果你决定这样做仍然。有一种疯狂的方式。列出所有调用的函数,然后检查所需的库。 (不确定这个,但我认为基于类似的逻辑ldd打印这个。) 根据man page 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.
上述命令行之间究竟有什么区别?为什么 第一个列表是libQt5Sql但是第二个列表没有?
差异是-r
-r, --function-relocs
Perform relocations for both data objects and functions, and
report any missing objects or functions (ELF only).
简而言之,它处理加载的库函数。
建议在redhat上的this bug中使用ldd -u -r
。
要了解有关重定位处理的更多信息,请阅读this oracle doc。