有没有办法确定应该加载哪些包或库来支持可执行文件?

有没有办法确定应该加载哪些包或库来支持可执行文件?

我想在计算机上安装一个无法重新编译的可执行文件,该可执行文件不是作为包构建的,并且我想下载运行它们所需的库。

ldd以下是在其上运行的部分输出

libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)

是否有一种工具可以使用此信息来选择应下载哪些包,或者更好的是仅提取列出的库及其依赖项,以最大限度地减少磁盘使用量?系统运行在无头虚拟机上,程序将通过VNC显示。

虽然我怀疑一个完整的图形桌面将提供大部分所需的库,但我只想下载所需的库、它们的依赖项以及足够的 X Windows 软件包来支持它。

答案1

您还没有说明您正在使用哪个操作系统,因此我将假设 Linux 并使用 Debian 作为示例。据我所知,对你的问题的快速回答是否定的。但这可能是一个有用的解决方法:

ldd your_prog | awk '{print $1}' | sed 's/\..*//' | 
  while read n; do echo "----- $n ----"; apt-cache search ^$n; done

这将解析ldd输出,然后运行apt-cache(将其替换为您操作系统的等效项)以在存储库中搜索名称和描述包含 . 返回的库名称的第一部分的包ldd

这不会找到所有的结果,并且会对某些结果(例如 )给出太多结果,libc但它可能会有所帮助。


@FaheemMitha 指出这apt-file可能是更好的方法。例如:

ldd /bin/bash | awk '/=>/{print $(NF-1)}'  | 
 while read n; do apt-file search $n; done |
  awk '{print $1}' | sed 's/://' | sort | uniq

这将返回提供链接库的包名称列表。

答案2

@terdon 的答案很好,但是使用Debian 系统上默认安装的dpkg-querydifferent 来实现这一点甚至更容易。apt-file

ldd /bin/bash | awk '/=>/{print $(NF-1)}' | while read n; do dpkg-query -S $n; done | sed 's/^\([^:]\+\):.*$/\1/' | uniq

这会生成一个包列表。

答案3

最好的选择是找到一个真正支持您的发行版的软件包。但如果这对你不起作用,那么我只知道另一种方法。

照常运行 ldd,然后手动安装这些依赖项。

例如libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

对我来说意味着安装apt-get install libpango:i386并祈祷 Debian stable 中的版本足够好。

你需要浏览 ldd、Google 的每一行,查看你可用的存储库,基本上你会很幸运。然后一一安装。直到程序真正运行起来。但 ldd 仅适用于“简单”程序。调用插件或运行任意代码的程序完全是另一回事。对于这些,您需要从控制台运行,并在发生崩溃/错误时修复它们。

也就是说,仅二进制可执行文件非常难以维护。您可能需要考虑使用其他东西。如果您的发行版比构建该可执行文件的系统稍微领先或落后一点,您可能永远无法让它工作。

相关内容