如何检测可执行文件缺少的依赖项?

如何检测可执行文件缺少的依赖项?

看着https://askubuntu.com/a/207750/23678作者如何知道缺少哪个依赖项?是否有通用的方法来查找可执行文件的依赖项列表以及缺少哪些依赖项?

更新:我刚刚注意到https://stackoverflow.com/a/9082947/14731用过的

readelf -l [可执行]

这是最好的方法吗?

答案1

在链接的 AskUbuntu 问题中,作者知道缺少哪个依赖项,因为他试图在 64 位 Ubuntu 安装上安装 32 位应用程序,引用他的话:

Ubuntu 64 位中缺少一些 32 位库。

所以他需要安装它们。

不过,回答你的问题:

  • 如何检测可执行文件缺少的依赖项?
  • 是否有一种通用的方法来查找可执行文件的依赖项列表以及哪些依赖项缺失?

是的,有一种方法可以检测缺少的依赖项或获取它们的列表。

检测缺失的依赖项:

包管理系统 apt基于 Debian 的 Linux 发行版中使用的 是一个聪明的系统,它会自动检测当前安装的软件包是否缺少依赖项(即使您使用dpkg而不是安装了它们apt-get)。假设您安装了一个软件包,但没有安装其依赖项,那么下次执行 时apt-get upgrade,您将收到类似以下的错误:

The following packages have unmet dependencies:
 package1 : Depends: package2 (>= 1.8) but 1.7.5-1ubuntu1 is to be installed

表示package1依赖于package2,并且package2(即本例中的较新版本)未安装。通常,要解决此问题,请执行命令sudo apt-get install -f,该命令指示apt-get尝试检索和安装缺少的软件包。

查找可执行文件的依赖项列表:

apt套件以及dpkg提供了一种简洁的方法来列出包的依赖关系。

  • 对于apt,命令是:

    apt-cache depends <packagename>
    

    这将检查存储库中的包并列出依赖项以及“建议”包。如果您确实想单独过滤掉依赖项,可以通过执行以下操作来过滤输出:apt-cache depends <packagename> | grep Depends。以下是示例输出:

    alaa@aa-lu:~$ apt-cache 依赖 vlc
    甚高频
      依赖:fonts-freefont-ttf
      取决于: vlc-nox
     |依赖: libavutil51
      依赖: libxpm4
      依赖: zlib1g
      预依赖:dpkg
      建议:videolan-doc
      推荐:vlc-plugin-notify
      推荐:xdg-utils
      中断:vlc-data
      休息:vlc-nox
      替换:vlc-data
      替代:vl​​c-nox

    为了简洁起见,输出被削减。

  • 对于dpkg,在本地文件上运行它的命令是:

    dpkg -I file.deb | grep Depends
    

    dpkg -I file.deb返回有关该文件的大量信息.deb,因此我们对其进行过滤以仅查看依赖项。

自从apt实际上只是 dpkg 的一个前端这两个命令本质上都做了同样的事情,它们会查看.deb应用程序的文件以找出它需要哪些依赖项,只不过apt-cache会查看存储库。这些“依赖项”列在里面文件.deb作为元数据,这就是为什么即使你已经从网站(例如,来自谷歌网站的谷歌 Chrome 浏览器)手动下载并安装了应用程序(通常是一个.deb文件,因此你将使用dpkg而不是安装它),仍然会通过分析已安装的软件包发现缺少依赖项。aptapt


我不太熟悉所有这些计算机架构的东西,但就这个问题中的 Java 而言,它实际上是关于 32 位和 64 位架构的。引用 stackoverflow 的答案:

您正在使用 64 位系统运行,没有 32 位运行环境。

需要安装的特定库未包含在安装包的“依赖项”部分中,因为他在 64 位系统上安装的是 32 位应用程序。因此,需要进行额外的故障排除才能找到罪魁祸首,因此使用了readelfldd。但是,这些可能更特定于库,请记住“依赖项”并不总是“库”,也可能是其他应用程序。所以“这是最好的方法吗?“,我对此表示怀疑;我认为只有在需要额外故障排除时它才是最好的。

相关内容