2017-03-13 8 views
7

私の質問に直接従う:32ビットASMコンパイラを使用してASMファイルをコンパイルし、64ビットプロジェクトに組み込み、コンパイル済みコードにアクセスするにはどうすればよいですかASMファイルの関数名を使用して?私は32ビットから64ビットへの私のプロジェクトを変換していVisual Studio - 64ビットプロジェクト内での32ビットコードのコンパイル

と私は技術的な問題に遭遇した:それは少し不明瞭である場合

、私は手の込んだことができます。私のプロジェクトはASMファイルをコンパイルし、そのコンパイルされたバイナリを入力として使用します。

私のプロジェクトが32ビットだったときは、とても簡単でした。私はプロジェクトにASMファイルを組み込み、Microsoft Macro Assemblerでコンパイルするビルドルールを追加しました - その後、ASMからアクセスしたい各機能を.hヘッダーファイルとアクセスにエクスポートして、32ビットプロジェクトのコンパイル済みコードにアクセスできましたそれは関数名を使用していました(プロトタイプを.hファイルにエクスポートしたので、objにコンパイルされ、リンカがシンボルを知っていたため、これを実行できました)。

このコードを64ビットに変換する必要がありますが、まだASMを32ビットコードとしてコンパイルする必要がありますが、同じことを実行できます(コンパイルされた32ビットコードをmy 64ビットプログラム)。 しかし、コンパイルしようとすると、プロジェクト全体が64ビットコードとしてコンパイルされているので、明らかに命令を認識しません。

ありがとうございます。

+1

64ビットプロセスで32ビットコードをロードまたは実行することはできません。あなたのオプションは、アセンブラコードを更新することです(64ビット用にコンパイルする:コードを変更する必要はないかもしれません)。 32ビットコードを独自のプロセスで実行することができます(親プロセスとのプロセス間通信の何らかの形で)。 – Richard

+0

@リチャードは、私はそれを実行する必要があると言っていない。コンパイルされた32ビットコードを自分のプログラムへの入力として使用する必要があります。 – Aviv

+2

@リチャード、私の64ビットアプリケーションに、コンパイルされた32ビット関数のコードを私の 'から移植する必要があることを想像してみましょう。 ASM'ファイルであり、私はまだ '。ASMファイルをプロジェクトに含めるが、32ビットコードとしてコンパイルする – Aviv

答えて

2

私が64ビットプログラムの中に32ビットコードを埋め込もうとしていたのですが(それは疑わしいことですが、正当な理由があり、あなたが何をしているのかを実際に知っているという議論のためにその結果を使って) - C、アセンブリなどで書かれているかどうかにかかわらず、32ビットコードを取り出して別のプロジェクトとしてコンパイルし、DLLを出力として生成します。これは、コンパイルチェーンに特別な奇妙なことはありません。通常の32ビットDLLです。

これで、32ビットDLLをバイナリリソースとして64ビットアプリケーションに組み込むことができます。これは、ロードしてアクセスできるメモリのほんの一塊です。

それでは、実際にそのDLLのコンパイル済みコードを使ってどのようにすればいいですか? Joachim BauchのMemoryModuleライブラリのややハッキングされたバージョンを使ってアクセスしたいと思います。 MemoryModuleはメモリの束からDLLをロードし、そのエクスポートにアクセスできるように設計されています.Windows APIのLoadLibrary()のように、ファイルではなくメモリからのみアクセスします。これは呼び出しプロセスと同じビットサイズで実行するように設計されていますが、ちょっとした面倒をみれば、おそらく64ビットライブラリとしてコンパイルできますが、32ビットライブラリを読み取ることは可能です。結果としての用途は非常に簡単になります:

// Load the embedded DLL first from the current module. 
hresource = FindResource(hmodule, "MyLibrary.DLL", "binary"); 
hglobal = LoadResource(hmodule, hresource); 
data = LockResource(hglobal); 
size = SizeofResource(hmodule, hresource); 

// Turn the raw buffer into a "library". 
libraryHandle = MemoryLoadLibrary(data, size); 

// Get a pointer to some export within it. 
myFunction = MemoryGetProcAddress(libraryHandle, "myFunction"); 

私は前に示唆したように、前記(そして他の人も示唆した)。つまり、あなたが輸出へのポインタを取得することができたとしても、あなたがそれらを呼び出すことはできませんコードは32ビットであり、4GBマークの下にあるアドレスにもロードされない可能性があるためです。しかし、実際に64ビットアプリケーションに32ビットコードを埋め込みたいのであれば、それをどうやって進めるのでしょうか。

関連する問題