コンパイラ ツール、execv、および s390x chroot 下の「exec フォーマット エラー」

コンパイラ ツール、execv、および s390x chroot 下の「exec フォーマット エラー」

私は2つのchroot環境を持つDebian 8 x86_64マシンを持っています。1つ目はarmelそして2つ目は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 バグ 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秒ツアーはこちらデビアン-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 の問題 799120: QEMU s390x で cc1/cc1plus が「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 パッケージを削除して再インストールすると、機能するようになります。

関連情報