尝试在 WSL 中解压 tgz 但出现 ELF 未找到错误

尝试在 WSL 中解压 tgz 但出现 ELF 未找到错误

我想解压一个 .tgz 文件,但出现ELF not found error。我在 WSL 中使用 Windows 10 和 Ubuntu 22.04。

以下是错误截图:

ELF 未找到错误

答案1

更新的简短答案:

应该在最新的 Jammy 更新中得到修复(请参阅下面的 Launchpad 报告)。

sudo apt update && sudo apt upgrade -y

... 然后再试一次。

如果没有,请告诉我(更重要的是,通过 Launchpad 报告告知 Ubuntu 团队),但这是旧的解决方法...

旧的简短答案:

printf '#!/bin/sh\nexec /lib64/ld-linux-x86-64.so.2 /usr/bin/gzip "$@"' | sudo tee /usr/local/bin/gzip
sudo chmod +x /usr/local/bin/gzip

解释:

这是目前 WSL1 和 Ubuntu 22.04(Jammy)以及其他一些最新发行版的一个已知问题:

由于许多软件包(包括apt)都使用了,这使得 Jammy 在 WSL1 下几乎无法使用gzip

请注意(对于使用不同术语搜索此内容的其他人),当创造tar 稍有不同:

/bin/sh: 1: gzip: Exec format error

gzip几年前,Ubuntu Eoan 也发生过类似(但不完全相同)的情况。参考:

从阅读这些问题的评论中,我不清楚问题出在 WSL1 还是用于创建二进制文件的工具链中gzip。在 Eoan 案例中,该问题最终在 中得到“解决” binutils,但我不清楚这是否只是针对 WSL1 核心问题的一种解决方法。

无论如何,有三种可能的解决方案:

  • 如果可以,请在 WSL2 下运行 Jammy。WSL2 中的 Linux 内核可以gzip毫无问题地处理更改。这只是 WSL1 ELF 加载器中的一个问题。

  • 使用上面的解决方法,用gzip通过 调用“真实”(但已损坏)版本的路径上的早期版本进行替换/lib64/ld-linux-x86-64.so.2

  • 一条评论在 WSL GitHub 问题中,可以修补gzip二进制文件以解决该问题。我个人不喜欢这种方法,但如果你想尝试一下:

echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))

由于工具链中的某些内容可能是罪魁祸首,因此该问题似乎也出现在:

  • 其他发行版(据报道是 Arch,几乎肯定还有其他发行版)
  • 其他二进制文件(据报道是 Node.js)

据报道,该 GitHub 线程中也有一个针对 Node 问题的补丁。

然而,修补分发二进制文件并非没有风险。希望有人能找出导致此问题的工具链问题,或者 WSL 团队会更改 ELF 加载程序代码以进行补偿。

答案2

为了使 Ubuntu-22.04 WSL 1 具有 gzip 1.10-4ubuntu4 的工作版本,您可以使用以下命令更改偏移量 0x189 处的值:

echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))

答案3

将 WSL 1 更改为 WSL 2 对我来说很有效

https://docs.docker.com/desktop/windows/wsl/#enabling-docker-support-in-wsl-2-distros

获取发行版名称列表:

wsl -l -v

更改 WSL 版本:

wsl --set-version <DISTRO NAME> 2

相关内容