バイナリは異なるCPUアーキテクチャ間で移植可能ですか?


16

私の目標は、組み込みLinux向けに開発できるようにすることです。ARMを使用したベアメタル組み込みシステムの経験があります。

さまざまなCPUターゲット向けの開発に関する一般的な質問があります。私の質問は次のとおりです。

  1. ' x86ターゲット、Linux OSバージョンxyz 'で実行するようにコンパイルされたアプリケーションがある場合、別のシステム ' ARMターゲット、linux OSバージョンxyz 'で同じコンパイル済みバイナリを実行できますか?

  2. 上記が当てはまらない場合、唯一の方法は、関連するツールチェーン「たとえば、arm-linux-gnueabi」を使用してアプリケーションのソースコードを再構築/再コンパイルすることです?

  3. 同様に、「x86ターゲット、Linux OSバージョンxyz」で動作するロード可能なカーネルモジュール(デバイスドライバー)がある場合、別のシステム「ARMターゲット、Linux OSバージョンxyz」で同じコンパイル済み.koをロード/使用できますか?

  4. 上記が当てはまらない場合、唯一の方法は、関連するツールチェーン「たとえば、arm-linux-gnueabi」を使用してドライバのソースコードを再構築/再コンパイルすることです?


27
いいえ、はい、いいえ、はい。
ホッブズ

7
AMDターゲットとIntelターゲットがなく、両方に単一のx86ターゲットがあることを理解するのに役立ちます。これは、IntelとAMDが十分に互換性があるためです。ARMターゲットが特定の理由で存在することが明らかになります。つまり、ARM CPUはIntel / AMD / x86と互換性がないためです。
–MSalters

1
いいえ、Javaランタイムなどのポータブルランタイム環境で実行するように設計されたバイトコードでない限り。組み込み用途のコードを書いている場合、コードは低レベルのプロセッサ固有の最適化または機能に依存する可能性が高く、移植が非常に難しく、ターゲットプラットフォーム用の単なるコンパイル以上のものを必要とします(アセンブリコードの変更、場合によっては書き換え複数のモジュールまたはプログラム全体)。
bwDraco-モニカの復活

1
@MSalters:実際には、AMDターゲットがあります:多くの場合x86-64というラベルが付けられているamd64(一方、x86は通常i386の再ラベル付けです)。幸いなことに、IntelはAMDアーキテクチャをコピー(および後で拡張)して、64ビットx86がamd64バイナリを実行できるようにしました。
スリーブマン

回答:


42

いいえ。ターゲットアーキテクチャに合わせてバイナリを(再)コンパイルする必要があります。Linuxは、すぐに使えるファットバイナリを提供します。その理由は、コードが特定のアーキテクチャのマシンコードにコンパイルされ、マシンコードがほとんどのプロセッサフ​​ァミリ間で非常に異なるためです(たとえば、ARMとx86は非常に異なります)。

編集:いくつかのアーキテクチャは後方互換性のレベルを提供することに注意する価値があります(さらにまれに、他のアーキテクチャとの互換性)。64ビットCPUでは、32ビットエディションとの下位互換性が一般的です(ただし、静的にリンクしない限り、C標準ライブラリを含む依存ライブラリも32ビットである必要があります)。また、言及する価値があるのはItaniumです。この場合、非常にゆっくりではありますが、x86コード(32ビットのみ)を実行できました。x86コードの実行速度の低さは、少なくとも市場であまり成功しなかった理由の少なくとも一部でした。

互換モードであっても、古いCPUで新しい命令でコンパイルされたバイナリは使用できないことに注意してください(たとえば、Nehalem x86プロセッサの 32ビットバイナリでAVXを使用することはできません。CPUはそれをサポートしません。

関連するアーキテクチャ用にカーネルモジュールをコンパイルする必要があることに注意してください。さらに、32ビットカーネルモジュールは64ビットカーネルでは機能しません。

バイナリのクロスコンパイルについては(ターゲットARMデバイスにツールチェーンを用意する必要はありません)、以下のgrochmalの包括的な回答を参照してください。


1
一部のx86バイナリがx64プラットフォームで実行できることを考えると、x86とx64の互換性(またはその欠如)について明確にする価値があるかもしれません。(これはLinuxの場合には
わかり

4
@ jpmc26 Linuxでは可能です。ただし、最初に互換性ライブラリをインストールする必要がある場合があります。x86サポートは、Win64インストールのオプションではありません。Linuxではオプションです。また、Linuxの世界では、すべての64ビットバージョンを利用できるようになっているため、一部のディストリビューションでは、デフォルトで(すべて?)32ビットライブラリがインストールされていません。(私はそれがあることを確認する方法は一般的ではないんだ。しかし、前にmainstreamishディストリビューションを実行している人から、それについていくつかのクエリを見てきました。)
ダン・ニーリー

@ jpmc26回答をメモで更新しました。私はそれについて言及することを考えましたが、答えを複雑にしたくありませんでした。
エリザフォックス

16

エリザベス・マイヤーズは正しいです。各アーキテクチャには、問題のアーキテクチャ用にコンパイルされたバイナリが必要です。システムが実行されているアーキテクチャとは異なるアーキテクチャ用のバイナリをビルドするには、が必要cross-compilerです。


ほとんどの場合、クロスコンパイラをコンパイルする必要があります。私は経験がありますgcc(ただし、、llvmおよび他のコンパイラも同様のパラメーターを持っていると思います)。gccクロスコンパイラを追加することによって達成される--target設定するには:

./configure --build=i686-arch-linux-gnu --target=arm-none-linux-gnueabi

gccglibcおよびbinutilsこれらのパラメーターを使用してコンパイルする必要があります(ターゲットマシンでカーネルのカーネルヘッダーを提供します)。

実際には、これはかなり複雑で、異なるシステムで異なるビルドエラーが発生します。

GNUツールチェーンのコンパイル方法についてはいくつかのガイドがありますが、Linux From Scratchをお勧めします。これは継続的に維持され、提示されたコマンドが何をするかを説明する上で非常に良い仕事をします。

別のオプションは、クロスコンパイラのブートストラップコンパイルです。クロスコンパイラをさまざまなアーキテクチャのさまざまなアーキテクチャにコンパイルするのに苦労したおかげで、crosstool-ng作成されました。クロスコンパイラを構築するために必要なツールチェーン上にブートストラップを提供します。

crosstool-ng異なるアーキテクチャでいくつかのターゲットトリプレットをサポートします。基本的には、クロスコンパイラツールチェーンのコンパイル中に発生する問題を整理するために人々が時間を費やすブートストラップです。


いくつかのディストリビューションは、クロスコンパイラをパッケージとして提供しています:

言い換えれば、クロスコンパイラの観点からあなたのディストリビューションが利用できるものをチェックしてください。ディストリビューションに必要なクロスコンパイラがない場合は、いつでも自分でコンパイルできます。

参照:


カーネルモジュールノート

クロスコンパイラを手動でコンパイルする場合、カーネルモジュールをコンパイルするために必要なものはすべて揃っています。これは、コンパイルにカーネルヘッダーが必要だからですglibc

ただし、ディストリビューションが提供するクロスコンパイラを使用している場合は、ターゲットマシンで実行されるカーネルのカーネルヘッダーが必要になります。


FWIW Fedoraにはクロスコンパイラも含まれています。
mattdm

@mattdm-おかげで、答えは微調整されました。fedorawikiの適切な部分がリンクされたと思います。
-grochmal

2
Linux From Scratchよりも簡単な方法で、別のアーキテクチャ用のLinuxとツールチェーンを入手できcrosstool-ngます。それをリストに追加することもできます。また、特定のアーキテクチャ向けに手作業でGNUクロスツールチェーンを構成およびコンパイルすることは、信じられないほど複雑で、単なる--targetフラグよりもはるかに退屈です。それがLLVMが人気を得ている理由の一部だと思う。別のアーキテクチャをターゲットにするために再構築する必要がないように設計されています-代わりに、同じフロントエンドとオプティマイザライブラリを使用して複数のバックエンドをターゲットにすることができます。
Iwillnotexist Idonotexist

@IwillnotexistIdonotexist-ありがとう、さらに答えを微調整しました。crosstool-ngについて聞いたことがありませんが、とても便利に見えます。実際、あなたのコメントは私にとって非常に役に立ちました。
-grochmal

9

最後の手段として(つまり、ソースコードがない場合)qemudosboxまたはなどのエミュレータを使用して、異なるアーキテクチャでバイナリを実行できることに注意してくださいexagear。一部のエミュレータは、Linux以外のシステムをエミュレートするように設計されています(たとえばdosbox、MS-DOSプログラムを実行するように設計されており、一般的なゲームコンソール用のエミュレータがたくさんあります)。エミュレーションには大きなパフォーマンスオーバーヘッドがあります。エミュレートされたプログラムの実行は、ネイティブプログラムよりも2〜10倍遅くなります。

非ネイティブCPUでカーネルモジュールを実行する必要がある場合、同じアーキテクチャのカーネルを含むOS全体をエミュレートする必要があります。知る限り、Linuxカーネル内で外部コードを実行することは不可能です。


3
エミュレーションの速度ペナルティは多くの場合10倍よりも高くなりますが、4GHzマシンで16Mhzマシン用に記述されたコードを実行しようとすると(速度の差は250:1)、50:1の速度ペナルティを持つエミュレータは依然として元のプラットフォームで実行するよりもはるかに高速にコードを実行します。
-supercat

7

バイナリはx86とARMの間で移植できないだけでなく、ARM にはさまざまなフレーバーがあります。

実際に遭遇する可能性が高いのは、ARMv6対ARMv7です。Raspberry Pi 1はARMv6であり、それ以降のバージョンはARMv7です。したがって、Pi 1で動作しない後のコードでコードをコンパイルすることは可能です。

幸いなことに、オープンソースとフリーソフトウェアの利点の1つは、任意のアーキテクチャでソースを再構築できるようにすることです。ただし、これには多少の作業が必要になる場合があります。

(ARMのバージョン管理は混乱を招きますが、番号の前にVがある場合は命令セットアーキテクチャ(ISA)について語っています。ない場合は、「Cortex M0」や「ARM926EJS」などのモデル番号です。 ISA番号で行います。)


2
...そして、同じARMフレーバーに対しても異なるサブフレーバーがあり、まったく同じハードウェアに対しても異なるABIがあります(ARMソフト/ソフトfp /ハード浮動小数点の混乱全体について考えています)。
マッテオイタリア

1
@MatteoItaliaうーん。複数のABIはスナフであり、病気よりもひどいものの治療法でした。一部のARMにはVFPまたはNEONレジスタがまったくなく、一部には16、32がありました。Cortex-A8以前では、NEONエンジンはコアの残りの部分で12個のCCを実行したため、ベクトル出力をGPRに転送するにはたくさん。ARMは、正しいこと、つまり機能の大規模な共通サブセットを義務付けることに着手しました。
Iwillnotexist Idonotexist

7

常にプラットフォームをターゲットにする必要があります。最も単純な場合、ターゲットCPUは、バイナリでコンパイルされたコードを直接実行します(これは、MS DOSのCOM実行可能ファイルにほぼ対応しています)。私が発明した2つの異なるプラットフォーム、ArmisticeとIntellioについて考えてみましょう。どちらの場合も、画面に42を出力する単純なhello worldプログラムがあります。また、プラットフォームに依存しない方法でマルチプラットフォーム言語を使用していると仮定します。そのため、ソースコードは両方で同じです。

Print(42)

Armisticeでは、数字の印刷を処理する簡単なデバイスドライバーがあるため、ポートに出力するだけです。ポータブルアセンブリ言語では、これは次のようなものに対応します。

out 1234h, 42

ただし、Intellioシステムにはそのようなものがないため、他のレイヤーを経由する必要があります。

mov a, 10h
mov c, 42
int 13h

おっと、マシンコードに到達する前に、この2つの間に大きな違いがあります!これは、LinuxとMS DOS、またはIBM PCとX-Boxの違い(おおよそ両方が同じCPUを使用している場合でも)にほぼ対応します。

しかし、それがOSの目的です。アプリケーション層ですべての異なるハードウェア構成が同じ方法で処理されることを保証するHALがあると仮定しましょう-基本的には、休戦でもIntellioアプローチを使用し、「ポータブルアセンブリ」コードは同じになります。これは、現代のUnixライクシステムとWindowsの両方で使用され、多くの場合、組み込みシナリオでも使用されます。良い-これで、ArmisticeとIntellioの両方で同じ真にポータブルなアセンブリコードを使用できます。しかし、バイナリはどうですか?

想定したとおり、CPUはバイナリを直接実行する必要があります。コードの最初の行、mov a, 10hIntellioを見てみましょう。

20 10

ああ。それmov a, constantは非常に人気があり、独自の命令と独自の命令コードを持っていることがわかります。休戦はどのようにこれを処理しますか?

36 01 00 10

うーん。のオペコードがmov.reg.immあるので、割り当てるレジスタを選択するために別の引数が必要です。また、定数は常にビッグエンディアン表記の2バイトの単語です。これが休戦の設計方法です。実際、休戦のすべての命令は例外なく4バイト長です。

ここで、ArmisticeでIntellioからバイナリを実行することを想像してください。CPUは命令のデコードを開始し、opcodeを見つけ20hます。休戦では、これは例えばand.imm.reg命令に対応します。2バイトのワード定数(10XX既に問題となっている)を読み取ろうとし、次にレジスタ番号(もう1つXX)を読み取ろうとします。間違った引数を使用して、間違った命令を実行しています。さらに悪いことに、次の命令は完全に偽物です。これは、データだと考えて別の命令を実際に食べたからです。

アプリケーションは動作する可能性がなく、ほとんどすぐにクラッシュまたはハングします。

これは、実行可能ファイルが常にIntellioまたはArmisticeで実行されると言う必要があるという意味ではありません。CPUに依存しないプラットフォーム(bashUnixなど)、またはCPUとOSの両方(Javaや.NETなど、最近ではJavaScriptなど)を定義する必要があります。この場合、アプリケーションはすべての異なるCPUとOSに対して1つの実行可能ファイルを使用できますが、プラットフォームに依存しないコードを何かに変換するアプリケーションまたはサービスがターゲットシステム(正しいCPUやOSを直接ターゲットとする)上にありますCPUは実際に実行できます。これは、パフォーマンス、コスト、または機能への打撃を伴う場合と伴わない場合があります。

CPUは通常、ファミリに付属しています。たとえば、x86ファミリのすべてのCPUには、まったく同じ方法でエンコードされた共通の命令セットがあるため、拡張機能を使用しない限り、すべてのx86 CPUがすべてのx86プログラムを実行できます(たとえば、浮動小数点演算またはベクトル演算)。x86での今日の最も一般的な例は、もちろんIntelとAMDです。Atmelは、組み込みデバイスで非常に人気のあるARMファミリのCPUを設計する有名な会社です。たとえば、Appleには独自のARM CPUもあります。

ただし、ARMはx86と完全に互換性がありません。設計要件は非常に異なり、共通点はほとんどありません。命令はまったく異なるオペコードを持ち、異なる方法でデコードされ、メモリアドレスは異なる方法で処理されます...安全な操作を使用して、x86 CPUとARM CPUの両方で実行されるバイナリを作成できる場合があります2つを区別し、完全に異なる2つの命令セットにジャンプしますが、実行時に正しいセットを選択するブートストラップのみで、両方のバージョンに個別の命令があることを意味します。


3

この質問をより身近な環境に再キャストすることは可能です。類推によって:

「実行したいRubyプログラムがありますが、プラットフォームにはPythonインタープリターしかありません。Pythonインタープリターを使用してRubyプログラムを実行できますか、それともPythonでプログラムを書き換える必要がありますか?」

命令セットアーキテクチャ(「ターゲット」)は言語、つまり「マシン言語」であり、CPUごとに異なる言語が実装されています。したがって、ARMのCPUにIntelバイナリを実行するよう要求することは、Pythonインタープリターを使用してRubyプログラムを実行しようとすることに非常に似ています。


2

gccは「アーキテクチャ」という用語を使用して特定のCPUの「命令セット」を意味し、「ターゲット」はCPUとアーキテクチャの組み合わせ、およびABI、libc、エンディアンなどのその他の変数を対象としています。 (おそらく「ベアメタル」を含む)。典型的なコンパイラーには、ターゲットの組み合わせの限られたセットがあります(おそらく1つのABI、1つのCPUファミリー、しかしおそらく32ビットと64ビットの両方)。通常、クロスコンパイラは、実行するシステム以外のターゲットを持つコンパイラ、または複数のターゲットまたはABIを持つコンパイラのいずれかを意味します(これも参照)。

バイナリは異なるCPUアーキテクチャ間で移植可能ですか?

一般的に、いいえ。従来の用語のバイナリは、特定のCPUまたはCPUファミリのネイティブオブジェクトコードです。ただし、中程度から非常に移植性の高い場合がいくつかあります。

  • あるアーキテクチャは別のアーキテクチャのスーパーセットです(一般的に、x86バイナリは、最新かつ最高のx86ではなく、i386またはi686をターゲットにしています-march=core2)。
  • あるアーキテクチャは、別のアーキテクチャのネイティブエミュレーションまたは変換(Crusoeを聞いたことがあるかもしれません)、または互換性のあるコプロセッサ(PS2など)を提供します。
  • OSとランタイムがマルチアーキテクチャをサポートする(たとえば、x86_64で32ビットx86バイナリを実行する機能)、またはVM / JITをシームレスにする(DalvikまたはARTを使用するAndroid )
  • サポートされている各アーキテクチャの重複コードを本質的に含む「脂肪」バイナリのサポートがあります

どうにかこの問題を解決できた場合、無数のライブラリバージョンの他の移植可能なバイナリの問題(私が見ているglibc)が現れます。(ほとんどの組み込みシステムは、少なくともその特定の問題からあなたを救います。)

まだ実行していない場合は、今すぐ実行してgcc -dumpspecsgcc --target-help何に直面しているかを確認するのに最適なタイミングです。

ファットバイナリにはさまざまな欠点がありますが、それでも潜在的な用途(EFI)があります。

ただし、他の回答には2つの考慮事項がありません。ELFとELFインタープリター、および任意のバイナリ形式の Linuxカーネルサポートです。ここでは、非リアルプロセッサのバイナリまたはバイトコードについて詳しく説明しませんが、これらを「ネイティブ」として扱い、Javaまたはコンパイル済みPythonバイトコードバイナリを実行することは可能ですが、そのようなバイナリはハードウェアアーキテクチャに依存しません最終的にネイティブバイナリを実行する、関連するVMバージョンで)。

現代のLinuxシステムはELFバイナリ(このPDFの技術的詳細)を使用します。動的ELFバイナリの場合、カーネルはイメージをメモリにロードする役割を担いますが、それはELFで設定された「インタープリター」の仕事ですヘビーリフティングを行うヘッダー。通常、これには、すべての依存動的ライブラリが利用可能であることを確認することが含まれます(ライブラリおよび必要なシンボルをリストする他の構造をリストする「動的」セクションの助けを借りて)—これはほぼ汎用の間接レイヤーです。

$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses \
shared libs), stripped
$ readelf -p .interp /bin/ls
    String dump of section '.interp':
      [     0]  /lib/ld-linux.so.2

(これ/lib/ld-linux.so.2もELFバイナリであり、インタープリターを持たず、ネイティブバイナリコードです。)

ELFの問題は、バイナリ(readelf -h /bin/ls)のヘッダーが特定のアーキテクチャ、クラス(32ビットまたは64ビット)、エンディアンネス、およびABI(Appleの「ユニバーサル」ファットバイナリが代替バイナリ形式Mach-Oを使用することをマークすることです。この問題を解決する代わりに、これはNextSTEPで発生しました)。つまり、ELF実行可能ファイルは、実行対象のシステムと一致する必要があります。エスケープハッチの1つはインタープリターです。これは任意の実行可能ファイル(元のバイナリのアーキテクチャ固有のサブセクションを抽出またはマップし、それらを呼び出すものを含む)になります、システムで実行できるELFのタイプに制約されます。 。(FreeBSDはの興味深い方法があるのLinux ELFファイルを処理し、そのbrandelfELF ABIのフィールドを変更します。)

LinuxMach-Oを(を使用してbinfmt_miscサポートします。そこには、ファット(32ビットおよび64ビット)バイナリを作成して実行する方法を示す例があります。もともとMacで行われていたリソースフォーク/ ADSは回避策になる可能性がありますが、ネイティブLinuxファイルシステムはこれをサポートしていません。

カーネルモジュールに.koもほぼ同じことが当てはまりますが、ファイルもELFです(インタープリターセットはありません)。この場合uname -r、検索パスでカーネルバージョン()を使用する追加のレイヤーがあります。これは、バージョニングを使用してELFで理論的に実行できるものですが、多少の複雑さと少しの向上が疑われます。

他の場所で述べたように、Linuxはファットバイナリをネイティブにサポートしていませんが、FatELFというアクティブなファットバイナリプロジェクトがあります。それは何年も前からありましたが、(現在期限切れの)特許の懸念のために、標準カーネルに統合されることはありませんでした。現時点では、カーネルとツールチェーンの両方のサポートが必要です。binfmt_miscアプローチを使用しません。これにより、ELFヘッダーの問題が回避され、ファットカーネルモジュールも使用できるようになります。

  1. 「x86ターゲット、Linux OSバージョンxyz」で実行するようにコンパイルされたアプリケーションがある場合、別のシステム「ARMターゲット、Linux OSバージョンxyz」で同じコンパイル済みバイナリを実行できますか?

ELFではなく、これを行うことはできません。

  1. 上記が当てはまらない場合、唯一の方法は、関連するツールチェーン「たとえば、arm-linux-gnueabi」を使用してアプリケーションのソースコードを再構築/再コンパイルすることです?

簡単な答えはイエスです。(複雑な回答には、エミュレーション、中間表現、翻訳者、JITが含まれます.i686バイナリを「ダウングレード」してi386オペコードのみを使用する場合を除き、ここではおそらく興味深いものではなく、ABIフィックスアップはネイティブコードの翻訳と同じくらい難しいでしょう。 )

  1. 同様に、「x86ターゲット、Linux OSバージョンxyz」で動作するロード可能なカーネルモジュール(デバイスドライバー)がある場合、別のシステム「ARMターゲット、Linux OSバージョンxyz」で同じコンパイル済み.koをロード/使用できますか?

いいえ、ELFではこれを実行できません。

  1. 上記が当てはまらない場合、唯一の方法は、関連するツールチェーン「たとえば、arm-linux-gnueabi」を使用してドライバのソースコードを再構築/再コンパイルすることです?

簡単な答えはイエスです。FatELFを使用する.koとマルチアーキテクチャのビルドが可能になると思いますが、ある時点で、サポートされているすべてのアーキテクチャのバイナリバージョンを作成する必要があります。多くの場合、カーネルモジュールを必要とするものはソースに付属しており、必要に応じてビルドされます。たとえば、VirtualBoxはこれを行います。

これはすでに長いとりとめのない答えです。もう1つだけ迂回路があります。カーネルには専用の仮想マシンがすでに組み込まれています。パケットを照合するために使用されるBPF VMです。人間が判読できる「ホストfooでポート22ではない」フィルター)はバイトコードにコンパイルされ、カーネルパケットフィルターがそれを実行します。新しいeBPFはパケット用だけではありません。理論的には、VMコードは現代のLinux間で移植可能であり、llvmはそれをサポートしますが、セキュリティ上の理由から、おそらく管理ルール以外には適していません。


バイナリ実行可能ファイルの定義にどれだけ寛大であるかに応じbinfmt_miscて、シェルスクリプトとコンテナ形式としてのZIPファイルを使用して、ファットバイナリサポートを(ab)use することができます。

#!/bin/bash

name=$1
prog=${1/*\//}      # basename
prog=${prog/.woz/}  # remove extension
root=/mnt/tmpfs
root=$(TMPDIR= mktemp -d -p ${root} woz.XXXXXX)
shift               # drop argv[0], keep other args

arch=$(uname -m)                  # i686
uname_s=$(uname -s)               # Linux
glibc=$(getconf GNU_LIBC_VERSION) # glibc 2.17
glibc=${glibc// /-}               # s/ /-/g

# test that "foo.woz" can unzip, and test "foo" is executable
unzip -tqq "$1" && {
  unzip -q -o -j -d ${root} "$1"  "${arch}/${uname_s}/${glibc}/*" 
  test -x ${root}/$prog && ( 
    export LD_LIBRARY_PATH="${root}:${LD_LIBRARY_PATH}"
    #readlink -f "${root}/${prog}"   # for the curious
    exec -a "${name}" "${root}/${prog}" "$@" 
  )
  rc=$?
  #rm -rf -- "${root}/${prog}"       # for the brave
  exit $rc
}

これを「wozbin」と呼び、次のように設定します。

mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
printf ":%s:%s:%s:%s:%s:%s:%s" \
  "woz" "E" "" "woz" "" "/path/to/wozbin" ""  > /proc/sys/fs/binfmt_misc/register

これ.wozにより、ファイルがカーネルに登録されwozbin、最初の引数が呼び出された.wozファイルのパスに設定されて、代わりにスクリプトが呼び出されます。

ポータブル(脂肪).woz ファイルを取得するにtest.wozは、ディレクトリ階層を持つZIPファイルを作成するだけです。

i686/ 
    \- Linux/
            \- glibc-2.12/
armv6l/
    \- Linux/
            \- glibc-2.17/

各arch / OS / libcディレクトリ(任意の選択)内に、アーキテクチャ固有のtestバイナリと.soファイルなどのコンポーネントを配置します。起動すると、必要なサブディレクトリがtmpfsインメモリファイルシステム(/mnt/tmpfsここ)に抽出され、起動されます。


0

ベリーブート、あなたの問題のいくつかを解決します。しかし、それは腕hf、x86-32 / 64bitのnormall / regullAr linuxディストリビューションで実行する方法の問題を解決しません。

isolinux(boatloader linux on usb)に組み込まれている必要があると思います。これは、正規のディストリビューションを認識できるライブコンバーターと、hfへの乗車/ライブ変換です。

どうして?各linuxをberryブートでarm-hfで動作するように変換できる場合、各ユーザーまたはubuntu creat起動ディスクでビルドしたisolinuxにberyブートメカニズムを組み込むことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.