尝试在 WSL 中解压 tgz 但出现 ELF not found 错误

kk-*_*cbx 4 tar windows-subsystem-for-linux

我想解压缩 .tgz 文件,但我得到了ELF not found error. 我在 WSL 中使用 Windows 10 和 Ubuntu 22.04。

这是错误的屏幕截图:

ELF 未找到错误

Not*_*1ds 9

更新的简短答案:

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

sudo apt update && sudo apt upgrade -y
Run Code Online (Sandbox Code Playgroud)

... 然后再试一次。

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

旧的简短回答:

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
Run Code Online (Sandbox Code Playgroud)

解释:

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

这使得 Jammy 在 WSL1 下相当无法使用,因为许多软件包(包括apt)都使用gzip.

请注意(对于使用不同术语搜索此内容的其他人),创建tar时的错误消息略有不同:

/bin/sh: 1: gzip: Exec format error
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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