【问题标题】:Library deployment vs unused direct dependencies库部署与未使用的直接依赖项
【发布时间】:2018-05-07 12:59:59
【问题描述】:

我试图找出哪些库 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,但第二个没有?

【问题讨论】:

    标签: linux qt dependencies shared-libraries ldd


    【解决方案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 会打印此内容。) 根据手册页 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 错误中使用ldd -u -r。 要了解有关重定位处理的更多信息,请阅读this oracle doc。

    【讨论】:

    • 这是否意味着如果-u - r 打印出任何库,应该联系维护人员/程序员以删除这些依赖项,因为它们绝对是不必要的(即错误)?还是在某些情况下仍然需要保留依赖项?
    • 不完全是,在bog项目中这样做很方便。因为它会很麻烦。即如果项目创建的 10 个二进制文件大多共享 LDFLAGS 变量。但是在 Makefile 中有一种方法可以像 gcc -o main main.c -lmylib 这样的硬编码库,但大多数情况下它是像 this 这样完成的,其中所有 c 文件都使用相同的 LDFLAGS。
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2013-10-31
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多