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ビットの場合は、ユーザーランドのビットサイズに従って実行ファイルを選択する必要があります。

詳説 データベース ―ストレージエンジンと分散データシステムの仕組み
[ad] 詳説 データベース ―ストレージエンジンと分散データシステムの仕組み
Alex Petrov, 小林 隆浩 (単行本(ソフトカバー))