どちらのファイルも32ビットで、ボード上で動くのは片方だけです。Intel向けのELF32ビルドとARM向けのELF32ビルドはクラスのフィールドで一致し、重要な点ではすべて食い違います。32ビット版を用意しているダウンロードページは、実際に落としたファイルのヘッダーを読むまで、ほとんど何も教えてくれません。名前を変えても命令は一つも変わりません。

クラスとマシンは別の問いに答える

クラスのフィールドは、そのファイルが32ビット構造と64ビット構造のどちらを使うかを示します。マシンのフィールドは、そのファイルがどの命令セット向けにコンパイルされたかを示します。前者だけを見るのが、いかにも納得できそうなファイル名のままx86ビルドがARMボードに載る理由です。どちらの値も同じコマンドから得られるので、片方を飛ばすのはとても簡単です。

同じ混乱は64ビットという表示にも当てはまります。aarch64とx86-64はワードサイズを共有するだけで、命令は一つも共有しません。64ビット版を一つだけ載せているベンダーのページは、そのベンダー自身のビルドを説明しているのであって、あなたのマシンの話ではありません。ページの列見出しではなく、ファイルのヘッダーを確認してください。

readelf -h ./vendor-vpn
readelf -l ./vendor-vpn | head -20
file ./vendor-vpn

最初のコマンドはヘッダーを表示し、クラスとマシンも含まれます。二つ目はプログラムヘッダーを表示し、そこにインタープリターの要求が入っています。三つ目は、表が不要なほど多いときに一行で済ませたい場合に使います。

実行権限を足したりディストリビューションのチェックを書き換えたりしても、何も変換されません。エミュレーションは、対応しているプラットフォームなら配備上の判断であり、性能と依存関係のコストを伴います。

インストーラーを実行する前にヘッダーを読む

信頼できる成果物から何かを実行する前に、その成果物を調べます。途中で失敗するインストーラーは、ライブラリを置き換えたまま何も動かない状態を残すことがあり、最初に手にしたアーカイブより悪い出発点になります。ヘッダーの確認は読み取りだけで、システム上は何も変わらないという意味で可逆です。

マシンのフィールドは、ボードの宣伝名ではなく、動作中のシステムのパッケージアーキテクチャーと比べます。32ビットのユーザーランドを動かす64ビットCPUには32ビットのビルドが必要で、この細部がどちらのダウンロードがネイティブかを決めます。制約はボードの能力ではなく、インストール済みのユーザーランドです。

dpkg --print-architecture
uname -m
getconf LONG_BIT

最初のコマンドは、システムがどのアーキテクチャー向けにパッケージを入れるかを報告し、一致させるべきなのはこの値です。残り二つはカーネルとワードサイズを表し、マルチアーキテクチャー構成ではユーザーランドと食い違うことがあります。

答えが食い違ったら、別のアーカイブを落とす前に、ベンダーがどちらを支援しているかを決めます。当て推量は、それぞれ違う地点で失敗するインストールの繰り返しを生み、どの失敗も新しい問題に見えます。

インタープリターを確認する。アーキテクチャーだけでは足りない

動的実行ファイルは、期待するローダーをプログラムヘッダーに記録します。ローダーのパスが違うシステムでは、マシンのフィールドが完全に一致していてもカーネルはファイルの起動を拒みます。これが、足りないライブラリを探し回る原因になる失敗です。

エラーメッセージはどちらのケースかを教えてくれますが、二つのケースは混同しやすいものです。形式やアーキテクチャーの拒否は、ファイルやインタープリターの欠如とは別物、そして別のパッケージを入れれば直るのは片方だけです。

readelf -l ./vendor-vpn | grep -A1 INTERP
ls -l /lib64/ld-linux-x86-64.so.2

最初のコマンドは、バイナリが要求するインタープリターのパスを示します。二つ目はそのパスが存在するかを確かめ、誤ったビルドと欠けたローダーを切り分けます。

信頼できないバイナリに依存関係の一覧ツールを走らせないでください。実装によっては、調べているファイルを実行してしまうことがあります。確認は読み取りだけにとどめ、未対応のビルドを動かすためにローダーのシンボリックリンクを足す誘惑に抗ってください。

事実を手元にそろえてビルドを頼む

OSのリリース、パッケージアーキテクチャー、クラスとマシンの値、最初のエラーメッセージをベンダーに送ります。この組み合わせは役に立つ返答を引き出しますが、ありふれた失敗のスクリーンショットはサポート用のテンプレートを受け取るだけです。

バイナリの話と設定の話は分けておきます。正しいビルドが動き出しても、プロファイル、認証情報、経路はそれぞれ別の問題であり、プロファイルをどれだけ編集してもアーキテクチャーの違うバイナリは動きません。

関連記事