2013-08-20 4 views
9

メモリストリームからライブラリをロードできますか?たとえば、私のライブラリはファイルにエンコードされています。私はいくつかの条件を確認し、ファイルをメモリストリームに解読します。今度は、そのストリームから解読されたライブラリを自分のアプリケーションにロードし、その機能を使用する必要があります。メモリストリームからライブラリをロードできますか?

+1

OSXでこれが見つかりました:http://stackoverflow.com/questions/11821955/load-dynamic-library-from-memoryこれはWindows用です:http://stackoverflow.com/questions/638277/loading-dll- from-a-location-in-memory – koopajah

+0

私はWindowsとLinux用のソリューションが必要です。 –

答えて

4

Windowsでは、DLLはファイルからのみロードできます - リンクが示唆しているように、ドライブとして使用することができますが、DLLの周りにファイルシステムに存在するファイルをロードする必要はありません。この理由の1つは、DLLが「デマンドロード」されていることです。つまり、システムがファイル全体を一度にメモリにロードせず、実際に使用されているパーツ、つまり4KB(通常は一度に)をロードします。スワップ領域にもスワップアウトされません。システムがメモリ不足の場合、破棄されてDLLから再ロードされます。

Linuxは非常に似たような方法で動作します(デフォルトでは同じ種類のデマンドロードを使用していますが、周囲に道があるかどうかはわかりません)ので、そこに他の方法はないと思いますいずれにしろ、私はそれを深みで調べていない。

もちろん、アプリケーションで使用できるコードがあり、それを暗号化/圧縮/その他のファイルとして保存したい場合は、実行可能なメモリをいくつか割り当てることができます(Windowsでは、VirtualAllocを使用して実行可能メモリを割り当てることができます)。ただし、絶対メモリアドレスをコード内で再配置する必要があるため、実行可能ファイルに再配置情報を格納する必要があります。

明らかに、簡単な解決策は、コンテンツをファイルシステム内のファイルに解凍し、そこからロードすることです。

+0

ramdiskよりはるかに優れた解決策はhttps://github.com/fancycode/MemoryModuleを参照してください(「良い」または「良い」解決策がある場合は、最初から試してみることをお勧めしません) )。 – Damon

+0

@Damon:それは私が3つ目の段落で説明していることを、私が言うことができるものから(私はすべてのコードを詳しく解説していない)やっています。 –

+0

@MatsPeterson:はい、まさにそれはそうです。これは、私が数年前に試した実用的な実装で、OPが望んでいる「RAMディスク」アプローチよりも若干優れています(とにかく、RAMディスクから暗号化されていないファイルを読み込めるからです)。もちろん、VM管理に真剣に干渉し、共有ライブラリのコンセプトといくぶん矛盾するので、私はまだそれを改ざんすることをお勧めしません。 DLLをファイルベースにするということは、同じページをいくつかのプロセスにマップして投げ捨て、必要に応じてリロードできることです。 – Damon

関連する問題