在 64 位系统上运行 32 位程序时出现“没有此文件”

在 64 位系统上运行 32 位程序时出现“没有此文件”

我下载了 Chromium 快照并将其解压缩,如下所示:

michael@ubuntu:/opt/chrome-linux$ ls
chrome                  libffmpegsumo.so                nacl_irt_x86_32.nexe
chrome.1                libppGoogleNaClPluginChrome.so  product_logo_48.png
chrome_100_percent.pak  locales                         resources
chrome.pak              nacl_helper                     resources.pak
chrome_sandbox          nacl_helper_bootstrap           xdg-mime
chrome-wrapper          nacl_irt_srpc_x86_32.nexe       xdg-settings

但当我尝试运行的时候chrome,它却不存在......

michael@ubuntu:/opt/chrome-linux$ ./chrome
bash: ./chrome: No such file or directory

有人知道为什么它打不开吗?运行 Xubuntu 12.10 AMD64。

michael@ubuntu:/opt/chrome-linux$ ldd /opt/chrome-linux/* | grep -i "not found"
ldd: /opt/chrome-linux/locales: not regular file
ldd: /opt/chrome-linux/resources: not regular file

答案1

您缺少 32 位支持。安装libc6:i386即 32 位基础库包,以及 Chrome 所需的所有其他 32 位库(它可能接近于Chromium 包)。

当您无法执行依赖于“加载器”的文件时,您收到的错误可能指的是加载器而不是您正在执行的文件。

  • 动态链接本机可执行文件的加载器是系统的一部分,负责加载动态库。它类似于/lib/ld.so/lib/ld-linux.so.2,并且应该是可执行文件。
  • 脚本的加载器是舍邦行,例如/bin/sh以 开头的脚本#!/bin/sh

错误消息相当具有误导性,没有表明加载器是问题所在。不幸的是,修复这个问题会很困难,因为内核接口只能报告数字错误代码,而不能表明错误实际上涉及另一个文件。

/lib/ld-linux.so.2一旦您安装了包中的32 位动态加载器,libc6:i386您至少会收到一条非误导性错误消息,告诉您其他缺少的库。

答案2

获得 Gilles 解决方案的最快方法是安装ia32-libs-多架构.虽然这确实吸引了很多包,它可以节省您弄清楚所有不同依赖关系的时间。

答案3

首先,检查ldd可执行文件中是否缺少库:

ldd "$(command -v lmutil)"
linux-gate.so.1 (0xf7ee3000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7ed0000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7dc9000)
libgcc_s.so.1 => not found
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7b6a000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7b65000)
/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xf7ee5000)

这里,很明显我们缺少一个库。安装 libgcc_s.so.1 解决了这个问题。现在ldd看起来完全正常:

linux-gate.so.1 (0xf7ee3000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7ed0000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7dc9000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7d9d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7b6a000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7b65000)
/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xf7ee5000)

然而,这只是我的情况的开始。症状仍然相同。stracegdb都讲述了相同的故事:

strace "$(command -v lmutil)"
execve(/* 26 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++

接下来,不要相信ldd。该文件/lib/ld-lsb.so.3实际上丢失了!

此外,Ubuntu 23.04 上没有软件包提供它(如 所示apt-file search)。实际上 Ubuntu 22.04 上也没有,除了那里,我将其分为软件包lsb-core。看起来,即使软件包没有包含该文件(如 所示dpkg -L),安装软件包时您会获得它(作为符号链接)。但是,Ubuntu 23.04 上不存在此软件包,而lsb-base它所拥有的软件包不会为您提供该符号链接。

解决方案:

ln -s ld-linux.so.2 /lib/ld-lsb.so.3

相关内容