如何运行包管理器未提供的需要 ia32-libs 的软件

如何运行包管理器未提供的需要 ia32-libs 的软件

我正在尝试在 Virtualbox VM 上安装 Arma 2 OA 专用服务器,这样我就可以在沙盒环境中测试自己的任务,这样我就可以将它们卸载到网络中的另一台计算机上。(另一台计算机正在运行 VM,但它是 Windows 计算机,我不想麻烦地安装它)它至少需要 2GB,最好是 4GB 的 RAM,所以我想安装 AMD64 版本的 ubuntu 13.10 来实现这一点。

如何在 64 位版本的 Ubuntu 上运行 32 位程序?' 已经解释了如何通过 apt-get 和/或 dpkg 安装 32 位软件,但这并不适用于这种情况。

该服务器在 Arma 游戏开发商 BI Studio 的网站上以压缩下载的形式提供。其安装说明显然与当前的最新技术略有不同。(可能是因为最新技术最近才更新 :))它指出我必须安装 ia32-libs,但现在显然已被弃用。现在我必须找出如何安装正确的软件包以确保它能够运行。

在这些问题上,我的经验水平就像是初级中级。我通过 apt-get 安装了很多软件包;我过去已经解决了依赖性问题;我没有不使用软件包管理器安装过很多软件。我可以处理基本的管理工作,比如编辑 conf 文件等。

我刚刚尝试安装它,而不是通过 apt-get 安装 ia32-libs,而是安装 gcc 来获取库。我的理由是 gcc 将包含用于向后兼容编码的文件,并且在 linux 上,所有库(据我所知)都安装在系统级别/libs。到目前为止,它似乎启动了。(我可以通过游戏内的网络浏览器连接到游戏服务器,因此它正在通信)我不确定在运行游戏服务器程序时是否有任何依赖项检查,所以我有几个问题:

  • 13.10 是否捕获对 ia32libs 库的任何调用并将这些调用转换为 amd64 上的正确代码?
  • 如果它运行,是否意味着所有必需的库都已正确加载,或者当所需的库毕竟丢失时,它是否有可能稍后崩溃?
  • 是否需要采取诸如安装 gcc 之类的解决方法?(以及其 i386 库)
  • 如何找出运行此软件可能需要哪些库?(或任何其他未通过包管理器提供的 32 位软件)

  • 答案1

    这主要取决于软件及其编写方式。在这种情况下,我会选择 32 位 Debian(如果有)二进制文件或已编译的 32 位二进制文​​件。这在我的回答中已经解释过了如何在 64 位版本的 Ubuntu 上运行 32 位程序?并演示了甚至可以运行 32 位系统的 64 位版本(这在几年前是不可能的)。在 64 位系统中运行 32 位应用程序实际上更容易。

    通常,当您运行二进制文件时,它会通知您缺少的库,您可以在存储库中查找。

    13.10 是否捕获对 ia32libs 库的任何调用并将这些调用转换为 amd64 上的正确代码?

    不。开发人员应该这样做。系统仅显示使用 GNU Linker 的库ld。如果软件试图使用“硬编码”库,那么您必须欺骗他并将它们指向正确的库。现代、编写良好的软件不需要这样做。

    如果它运行,是否意味着所有必需的库都已正确加载,或者当所需的库毕竟丢失时它是否会稍后崩溃?

    如果可以运行,则完美。通过库在可执行文件的启动时加载,如果没有它们(即缺少其中一些),它将无法启动,但即使它们存在,也不是所有调用都在启动时调用,因此某个函数的某个调用可能会改变其行为方式,而应用程序不支持这种情况,从而导致崩溃。这是极端情况,但它们是可能的,因此您可能会注意到它是否与较新的库不兼容。但是,那是另一个问题。要解决这个问题,您必须适应新的库或降级已安装的库。

    是否需要采取诸如安装 gcc 之类的解决方法?

    gcc是一个编译器。只有当您使用 C 或 C++ 编译代码时才需要安装它。其他情况可能需要解决方法,但我还没有看到需要编译器gcc才能运行的“二进制文件”(已编译的可执行文件)。

    如何找出运行此软件可能需要哪些库?(或任何其他未通过包管理器提供的 32 位软件)

    有点粗暴,但如果说明没有明确说明您需要哪些库,或者使用命令ld-linux.so --list。例如:

    $ /lib64/ld-linux-x86-64.so.2 --list /bin/bash
        linux-vdso.so.1 =>  (0x00007fffd479f000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f0d39138000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0d38f34000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0d38b6a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0d3937f000
    

    ldd二进制文件提供了相同的输出,感谢@ubfan)

    如您所见,bash使用 linux-vdso、libtinfo.so、libdl.so 和 libc.so。如果这些库正确,则bash对它们感到满意。这是动态链接双星。您也可以使用来--verify检查二进制文件是否真的是动态链接的。

    然后你取图书馆的名字,比如说库信息.so.5,它包含在软件包中:

    File                                Packages
    /lib/i386-linux-gnu/libtinfo.so.5   libtinfo5 [not amd64]
    /lib/x86_64-linux-gnu/libtinfo.so.5 libtinfo5 [not i386]
    /lib32/libtinfo.so.5                lib32tinfo5 [not i386]
    /lib64/libtinfo.so.5                lib64tinfo5 [not amd64]
    /usr/lib/debug/libtinfo.so.5        libtinfo5-dbg
    /usr/libx32/libtinfo.so.5           libx32tinfo5
    

    因此,我们只需要为二进制文件的体系结构安装正确的包(如果是 32 位,则:i386在包名称中添加 64 位:amd64),就可以了。

    不用说,要在 32 位平台上运行 64 位二进制文​​件,您的 CPU 必须支持 64 位(2008 年及以后的大多数系统都支持),并且很可能需要安装 64 位内核。

    相关内容