2010-11-18 13 views
2

C++ファイルを生のマシンコードにコンパイルし、Cで書かれたプラットフォーム依存のスタータで実行したい(fread(buffer、1、len (b);)WindowsとLinux(x86)で同じバイナリコード

生コードを出力するにはどうすればよいですか?

関数呼び出しは機能しますか?どうすればそれを動作させることができますか?

私はLinuxとWindowsの呼び出し規約が異なると思います。これは問題ですか?どうすれば解決できますか?

EDIT:PEとELFが実行可能ファイルの直接開始を妨げることがわかりました。しかし、それは私がスターターを持っているものです。

+0

が発生するつもりはない(ELFなどに実行可能なPEを変換し、分解)

はまたAgnerのobjconvを見て(Monoランタイムが必要です)全く異なるオブジェクトファイル形式 – KevinDTimm

+0

私は答える資格はありませんが、確かにこのようなことが可能であるはずです。おそらく、組み込みシステムのように、標準ライブラリに依存しないコードを書くことができれば、x86チップ上で実行できるはずです。 – sdg

+2

この質問を見るhttp://superuser.com/questions/209703/why-wont-windows-exes-work-on-linux - 短い答えELF(linux)対PE(windows) – KevinDTimm

答えて

6

このうちのいくつかを達成するための(比較的)単純な方法があり、これは「位置独立コード」と呼ばれています。これについては、コンパイラのドキュメントを参照してください。

つまり、いくつかのソースをバイナリにコンパイルすることができます。このバイナリは、アドレス空間のどこに配置しても実行されます。あなたがファイルにこのようなx86バイナリコードを持っていて、mmap()(またはそれに相当するもの)をLinuxとWindowsの両方から呼び出すことができます。

制限事項は当然のことですが、バイナリコードでは両方のプラットフォームで同じ呼び出し規約を使用するように制限する必要があります。両方のプラットフォームで表現できます(32ビットx86ではargsを渡します)。 EAXのスタックと戻り値)、もちろんコードは完全に自己完結型でなければなりません。DLL関数呼び出しはシステム依存であり、システムコールでもありません。

すなわち:

  1. あなたはあなたがオブジェクトファイルからマシンコードを抽出する必要があります任意の外部依存関係
  2. せずに自己完結型のコードを作成する必要があります位置独立コード
  3. を必要としています。

mmap()がファイルを作成し、関数ポインタを初期化し、(* myblob)(someArgs)が行う可能性があります。

gccを使用している場合、 "-ffreestanding -nostdinc -fPIC"オプションを使用すると、最初の2つのオプションについてほとんどのものが得られます。その後、objdumpを使用してELFオブジェクトファイルからバイナリBLOBを抽出します。

1

WindowsとLinuxの両方で同じ実行ファイルを実行することはできません。

(STL、Boost & Qtでこれを助けることができます)、次にLinuxのG ++でコンパイルしてlinux-binaryを出力し、同様にWindowsプラットフォームのコンパイラで出力します。

EDIT:また、おそらく、これらの2つのポストはあなたを助けるかもしれない:そのようなことをやって

One

Two

+0

2つのプラットフォームが互換性がないものは何ですか?どちらもx86を使用します。 – dkreuter

+1

x86は命令セットアーキテクチャファミリであり、実行可能ファイルとオペレーティングシステムの構造とは関係ありません。私は、クロスプラットフォームプログラミングに関して私が投稿したいくつかの他の回答を掲載しました。 –

0

はかなり複雑になります。発行されているcpuコマンドの問題だけではなく、コンパイラーはコードにリンクされる多くのライブラリーに依存しています。これらのライブラリは実行時に一致させる必要があります。そうしないと動作しません。

たとえば、STLライブラリは一連のテンプレートとライブラリ関数です。コンパイラはいくつかの構造体をインライン化し、他の構造体のライブラリを呼び出します。それはまったく同じライブラリでなければなりません。理論的にはあなたが任意のライブラリを使用して避けることができ、ちょうど基礎に書くが、それでもそこにコンパイラが呼び出し規約、関与しているデータ・アラインメントの種類、彼らがどのように機能するかについての仮定を行うこと

、など

私を間違えないでください、それは働くことができます。 Linuxで使用されているWindowsのWINEプロジェクトや他のネイティブドライバを見てください。私はそれがあなたがすばやく簡単にできるものではないと言っているだけです。

各プラットフォームで再コンパイルするのが良いでしょう。

+0

このポストにあまりにも多くの無関係なアイテムと間違ったアイテムがあります – KevinDTimm

2

理論的には、これのいくつかは達成可能です。しかし、それは本当に何かのための実用的な解決策ではない道に沿って非常に多くの落書きがあります。

  • システムコールフォーマットは
  • 完全に互換性がありませんDEPは、コード
  • メモリレイアウトとして実行データを防ぐことができますあなたはそれを実行する前に、効果的にコードを動的に「再リンク」する必要が異なる
  • です。
  • ...など...
+0

リンクがありますか?私は、プラットフォームに依存するものを実行する関数を指すインクルードコードに関数ポインタを渡すことができると考えました。システムコールのように。 – dkreuter

-1

あなたのLinuxシステム上で利用可能WINEを持っている場合にのみ達成可能です。そうしないと、実行可能ファイル形式の違いにより、Linux上でWindowsコードを実行できなくなります。

1

なぜワインを見ないのですか? Linux上でWindows実行ファイルを使用するためのものです。もう一つの解決策は、Javaまたは.NETのバイトコードを使用することです。 2 -

あなたがLinux上での.NET実行可能ファイルを実行することができますがhttp://www.agner.org/optimize/#objconv

関連する問題