created: 2023-05-20T01:40:07.424Z
Linux Compatibility handler
カーネルのバージョンと、ユーザランドでビットサイズが違ってもいいなんて知らなかった。
In order to support 32-bit user space running on a 64-bit machine
Compatibility handler for 32 bit userspace running on 64 kernels
RasbianOS(32bit) 上で go コマンドを実行すると以下のようなエラーになります。
$ go
-bash: /opt/go/1.20.4/bin/go: No such file or directory
file コマンドで確認すると、ファイル自体は存在しているようです。
$ file $(which go)
/opt/go/1.20.4/bin/go: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, Go BuildID=jvXjoLxCSBfOUTuSIVkf/__5mSsz9XUrphdoRVSnC/iQUlMsirBZkSHT9hsoxY/TFMhRuiUZonbX61yxf9k, with debug_info, not stripped
ビットサイズが32ビットのユーザランドでビットサイズが64bitの実行ファイルを実行しようとすると、ビットサイズによるエラーではなく No such file or directory
というエラーが出力されるということはありますか?
なお、RasbianOS(32bit)を使っていることは getconf LONG_BIT
で確かめました。
$ getconf LONG_BIT
32
また、arch コマンドで確認したところ、カーネルのビットサイズは64ビットとなっていました。
$ arch
aarch64
ChatGPT
Raspbian OS(32ビット)では、32ビットのユーザーランドで64ビットの実行ファイルを実行することは一般的にはできません。この場合、エラーメッセージに「No such file or directory」が表示されるのは、実行ファイルが見つからないためです。
Raspbian OSが32ビットの場合には、32ビット版のGoバイナリを使用する必要があります。64ビット版のGoバイナリを使用すると、エラーが発生します。
Go言語の公式ウェブサイトから正しいバージョンのGoをダウンロードし、32ビット版のバイナリをインストールしてみてください。それによって、この問題は解決するはずです。
また、カーネルのビットサイズが64ビットであっても、ユーザーランドが32ビットの場合は、ユーザーランドのビットサイズに従って実行ファイルを選択する必要があります。