【问题标题】:How can I check the dependencies required by a binary file in Linux?如何检查 Linux 中二进制文件所需的依赖项?
【发布时间】:2021-11-04 13:01:50
【问题描述】:

我用 C 语言制作了一个控制台应用程序,并且正在为第一个版本做准备。 由于使用了 readline,我确信我的二进制文件依赖于 libreadline-dev,但我无法识别以下 2 个库背后的依赖关系:libm.so.6 libc.so.6

这两个库的来源是哪些包?我怀疑它一定是 gcc 附带的或预装在我的 Linux 发行版(Pop_OS!21.04)上的东西。 另外,我如何确保未来版本的依赖项不会破坏我的应用程序?我可以以不需要共享库的方式编译我的应用程序吗?

【问题讨论】:

  • 你不太可能需要 libreadline-dev 这是开发所需的头文件。
  • 我不知道我是怎么错过这个评论的,但是你是对的,它只需要编译。 readline 是否也已经捆绑或者我应该将其列为依赖项? @斯塔克

标签: c linux dependencies


【解决方案1】:

如何在 Linux 中检查二进制文件所需的依赖关系?

运行ldd <file> - 这将列出二进制文件的所有依赖项,包括依赖项的依赖项。

示例输出:

$ ldd $(which ls)
        linux-vdso.so.1 (0x00007ffe0c93d000)
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fa2abcd1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa2ab8e0000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fa2ab66e000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa2ab46a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa2ac11b000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa2ab24b000)

这两个库的来源是哪些包?

libmlibc 都是 glibc 的一部分 - 它几乎与每个 Linux 发行版捆绑在一起。

另外,我如何确保未来版本的依赖项不会破坏我的应用程序?

在纸面上,你不能 - 对于非标准化的依赖关系,这是一个真正的问题,并且依赖关系管理是一个困扰许多应用程序的大问题。

但特别是关于 libmlibc - 这些是标准化的库,将来很可能保持向后兼容。除非你在做一些非常深奥的事情,否则我不会担心。

libm.so.6libc.so.6 的名称可能具有欺骗性,因为 .6 后缀可能会导致您认为您依赖于某些“版本 6” - 但这是出于历史原因的后缀并且具有几十年来一直保持不变,因此在未来的 Linux 发行版中不太可能发生变化。


我能否以不需要共享库的方式编译我的应用程序?

您可以将其编译为 静态链接 二进制文件,使用类似 gcc -static... 的命令 - 但这会使您的二进制文件膨胀,除非您真的需要,否则不建议使用它。

【讨论】:

  • 即使 glibc 几乎是每个 Linux 发行版的一部分,我仍然需要将它列为依赖项,对吧?
  • 是的,为了完整起见,您甚至可以列出glibc 的最低版本 - 您可以运行apt depends <program> 并看到许多程序将glibc 列为依赖项。
  • -shared 静态编译?我想你已经和static.混在一起了……见stackoverflow.com/a/8692187/1212012
  • 奇怪的是,我将 glibc 作为我的 deb 包的依赖项包含在内,它无法解决依赖关系,但是当我用 libc6 替换它时它工作了。 @丹尼尔·克莱因斯坦
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2023-04-11
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多