在 64 位 Debian Jessie 上运行 32 位可执行文件

emi*_*tin 5 linux debian 64-bit 32-bit

我正在尝试安装 Adob​​e Air(Balsamiq Mockups 需要),当我尝试运行安装程序时,我得到:

sudo: unable to execute ./AdobeAIRInstaller.bin: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我确保该文件是可执行的,并且通过谷歌搜索,似乎尝试在 64 位系统上运行 32 位可执行文件会做到这一点。在这一点上,每个人的建议似乎都是安装 ia32-libs,但是该软件包在 Debian Jessie 中不再存在(他们似乎重构了多架构支持)。

我需要做什么?安装了 multiarch-support,还有别的吗?

kos*_*tix 4

一些背景

是的,ia32-libs这是实现真正的多架构之前的权宜之计——基本上,该包仅包含一些流行库的一堆 32 位版本。

你现在要做的是

  1. i386启用foregin架构dpkg

    dpkg --add-architecture i386
    
    Run Code Online (Sandbox Code Playgroud)
  2. 找出这个东西想要什么库并安装适当的 32 位 ( i386) 版本,例如

    apt-get install libfooX.Y:i386
    
    Run Code Online (Sandbox Code Playgroud)

请注意一些不幸的事情:

  • Debian 中的多架构基于以下事实:依赖于架构的库安装到依赖于架构的目录中,就像/usr/lib/x86_64-linux-gnu本机amd64库和同一系统上的相同/usr/lib/i386-linux-gnu/库一样。 i386

    这里的问题是,第三方软件不知道 Debian 中实现的多架构,通常希望使用众所周知的名称(如 )找到它所依赖的库/usr/lib/libfoo.so.X.Y.Z,而最近的 Debian 根本不是这种情况版本。

    这可以通过符号链接或使用其他一些方式扰乱动态加载器来解决LD_PRELOAD(例如,使其使用替代缓存文件而不是/etc/ld.so.cache,包含对其他地方安装的库的引用),但请参阅下一点。

  • IIRC,Linux 兼容版本的 Adob​​e Air 的工作已经停止了相当长的一段时间,因此最新的 Adob​​e Air blob 可能依赖于最新版本的 Debian 中不存在的相当过时的库版本。更新的库意味着 API/ABI 的更改,而这些无法使用符号链接来解决。

可能的解决方案

如果摆脱这个 Adob​​e 令人厌恶的东西是不可能的,我可能会尝试依赖 Linux内核的API/ABI 相当稳定的事实,并尝试创建一个chrootLXC环境,专门使用从任何声称的操作系统中提取的库来运行这个 blob与其兼容。

基本上,对于 chroot,您需要创建一个目录,其中包含/bin/bash具有众所周知名称(如 )的最小库集(可能是一些二进制文件,如/usr/lib/libfoo.so)。

这并不完全是一个简单的方法(您需要大量的试错回合,配备readelfldd、提取和复制文件等),但它可以解决,因为最后,所有库都会调用内核使用系统调用,并且这些在各个内核版本中都非常稳定。