クロスコンパイルを可能にするには秘密があります。静的 qemu バイナリをファイルシステムにコピー<different-arch-root-to-be>/usr/bin
し、そのファイルシステムに chroot すると、ファイルシステムに非ネイティブバイナリがあり、魔法のようにこれらのバイナリをファイルで使用できます。ホストCPUによって実行され、uname -a
同様にターゲットアーキテクチャにあることを宣言します。最終的な結果は、非常に単純なクロスコンパイルが得られることです。
どのように機能するかを想像できますが、chroot
注意が必要ですqemu
。
そうですか?これがどのように機能するかについてのドキュメントが見つからないようです。
答え1
Linuxには、ファイルを実行するように指示されたときにカーネルがインタプリタプログラムを呼び出すようにプラグインを登録するメカニズムがあります。binfmt_misc。簡単に言えば、実行ファイルが実行されると、カーネルは次のように最初の数バイトを読み込みます。
- 4バイトで始まり、
\x7fELF
その後に有効なように見えるELFヘッダーが続きますか?その場合は、以下を使用してください。非常に低い周波数カーネルのローダーはプログラムをロードして実行します。 - 2バイトで始めますか
#!
(シェルボーン)?その場合は、最初の行を読み、次の内容を解析し、その行を実行してパスを実行可能ファイル#!
に引数として渡します。 - binfmt_miscメカニズムで登録された魔法の値の1つから始まりますか?その場合、登録されたインタプリタが実行されます。
Qemuを介して外部アーキテクチャバイナリを実行するには、サポートされている各アーキテクチャのELFヘッダに対応するマジック値をbinfmt_miscメカニズムで登録する必要があります。/proc/sys/fs/binfmt_misc/
現在カーネルに登録されているbinfmt_miscインタプリタセットを表す特別なファイルシステムであるディレクトリを一覧表示して、サポートされている内容を確認できます。たとえば、
cat /proc/sys/fs/binfmt_misc/qemu-arm
enabled
interpreter /usr/bin/qemu-arm-static
flags:
offset 0
magic 7f454c4601010100000000000000000002002800
mask ffffffffffffff00fffffffffffffffffeffffff
したがって、実行可能ファイルが指定された/somewhere/foo
マジックバイトで始まる場合。/somewhere/foo arg1 arg2
/usr/bin/qemu-arm-static /somewhere/foo arg1 arg2
このメカニズムはchrootを使用せずに機能し、実行可能ファイルはどこにでも配置できます。動的実行可能ファイルを機能させるには、chrootingが便利です。動的実行可能ファイルにはローダへの絶対パスが含まれているため、たとえばARM実行可能ファイルを実行すると、/lib
ローダが実際に配置されると予想されます。/different-arch-root-to-be
実行可能ファイルは、ローダーを見つけるためにディレクトリをchrootする必要があります。