有没有一种方法可以确定应该加载哪些软件包或库来支持可执行文件?


11

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

以下是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)。
terdon

在这种情况下是Debian和Ubuntu
vfclists 2014年

在这种情况下,我的答案应该对您有用。
terdon

实际上,我将要进行测试,迟来了。我简直忘记了它,只是问了一个类似的问题,导致这个问题显示为最相关的问题,
哈哈

Answers:


14

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

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

这将解析ldd输出,然后运行apt-cache(将其替换为与您的OS相同的名称)以在存储库中搜索名称和说明包含的库名称的第一部分所返回的包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

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


1
apt-file search在箭头右侧的实际文件上,可能会更有效。
Faheem Mitha

@FaheemMitha很好,谢谢。答案已编辑。
terdon

如何调整该命令以测试系统上是否存在该库,以便找到需要下载的库?我认为我最近提出的问题更多。我要求将其重新打开。
vfclists 2014年

@vfclists确实不值得,apt-get install所有它们以及所有已安装的都将被忽略。
terdon

原因是创建一个没有多余库的虚拟机以便快速下载。软件包安装包含很多不必要的项目,我只需要可执行文件所需的库文件及其依赖项,这也使我有机会磨练bash和Linux技能。没有python。
vfclists 2014年

3

@terdon的答案很好,但使用它更容易,dpkg-query这与apt-fileDebian系统默认安装的方式不同。

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

这将产生一个软件包列表。


1

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

根据需要运行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仅适用于“简单”程序。调用插件或运行任意代码的程序是完全不同的事情。对于这些,您需要从控制台运行,并修复崩溃/错误。

也就是说,仅二进制可执行文件很难维护。您可能要考虑使用其他东西。如果您的发行版在构建该可执行文件的系统之前或之后,您可能永远无法使它正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.