s390x chroot下的編譯工具、execv和“exec格式錯誤”

s390x chroot下的編譯工具、execv和“exec格式錯誤”

我有一台 Debian 8 x86_64 機器,有兩個 chroot 環境。第一個是armel第二個是s390xarmel上週安裝的,並且s390x最近安裝的。armel之前和之後都很好s390x安裝。但是我在新安裝的環境下編譯時發現錯誤s390x

# chroot debian-s390x
# g++ -dumpmachine
s390x-linux-gnu

# cd /home/cryptopp-5.6.3/

# make
g++ -DNDEBUG -g2 -O2 -pipe -c osrng.cpp
g++: error trying to exec '/usr/lib/gcc/s390x-linux-gnu/5/cc1plus': execv: Exec format error
GNUmakefile:382: recipe for target 'osrng.o' failed
make: *** [osrng.o] Error 1

我在搜索時找不到任何信息/usr/lib/gcc/s390x-linux-gnu/5/cc1plus': execv: Exec format error

我確實找到了一些與 相關的閱讀內容cc1plus,但我沒有看到安裝有問題:

# file /usr/lib/gcc/s390x-linux-gnu/5/cc1plus
/usr/lib/gcc/s390x-linux-gnu/5/cc1plus: ELF 64-bit MSB executable, IBM S/390, version 1
(GNU/Linux), dynamically linked, interpreter /lib/ld64.so.1, for GNU/Linux 2.6.32,
BuildID[sha1]=aaa1e442e47e5e41c36b70d5e6a8f538da4ca3e7, not stripped

我還執行了重新安裝g++apt-get install --reinstall g++,但沒有幫助。

問題是什麼,解決方案是什麼?


編輯:這可能是問題所在,也可能是相關問題:Debian Bug 684909:qemu-system-s390x 已損壞,沒有引導程式“s390-zipl.rom”


我不相信這是由於我正在嘗試編譯的專案造成的:

# cat test.cxx 
#include <iostream>

int main(int argc, char* argv[])
{
  return argc;
}

# g++ test.cxx 
g++: error trying to exec '/usr/lib/gcc/s390x-linux-gnu/5/cc1plus': execv: Exec format error

以下是 5 秒的安裝流程概覽Debian-s390x環境:

# apt-get install qemu-user-static debootstrap
# qemu-debootstrap --arch=s390x --keyring /usr/share/keyrings/debian-archive-keyring.gpg
  --variant=buildd --exclude=debfoster unstable debian-s390x http://ftp.debian.org/debian
# chroot debian-s390x
# apt-get install locales build-essentials emacs-nox

答案1

事實證明這是 binfmt 註冊的問題。摘自 Michael Tokarev 的訊息Debian Issue 799120:cc1/cc1plus 在 QEMU s390x 下失敗,並出現“execv: exec format error”,無法編譯 C++ 程式:

這已在您報告此問題的版本 1:2.4+dfsg-3 中修復,我在其中更新了 binfmt 掩碼以也包含 OSABI_GNU。這是#784605。

但是,我們在更新 binfmt 註冊時似乎遇到了問題。如果您之前安裝了 qemu-user-static 軟體包(僅註冊 OSABI_SYSV 變體)並將其更新至目前版本(應註冊 SYSV 和 GNU 變體),則核心內註冊不會更新。它將在重新啟動時更新,或者您可以刪除並重新安裝 qemu-user-static 軟體包,之後它將起作用。

相關內容