库部署与未使用的直接依赖关系
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
我试图找出发生了什么,但我没有完全理解它。
我的问题是:
- 什么是未使用的直接依赖(这听起来与
我)?
- 是否有可能查明
Qt Assistant
是否真的需要一个未使用的
直接依赖(除了启动它并等待错误)?
- 以上命令行到底有什么区别?为什么
第一个列表 libQt5Sql
但第二个列表没有?
因为-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 文档。
我试图找出哪些库 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
我试图找出发生了什么,但我没有完全理解它。
我的问题是:
- 什么是未使用的直接依赖(这听起来与 我)?
- 是否有可能查明
Qt Assistant
是否真的需要一个未使用的 直接依赖(除了启动它并等待错误)? - 以上命令行到底有什么区别?为什么
第一个列表libQt5Sql
但第二个列表没有?
因为-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 文档。