6

mac / gccのファイルシステムからではなく、メモリからライブラリをロードすることは可能ですか?

WindowsではMemoryModuleを使用していますが、明らかにクロスプラットフォーム互換ではありません。

4

1 に答える 1

9

まず最初に、これを行うには、OSXABIダイナミックローダーリファレンスを読むことをお勧めします。

これを行うには、NSCreateObjectFileImageFromMemoryAPIを使用する必要があります。

メモリ内のMach-Oファイルへのポインタを指定すると、この関数はNSObjectFileImage参照を作成して返します。-bundle現在の実装はバンドルでのみ機能するため、リンカーオプションを使用してMach-O実行可能ファイルをビルドする必要があります。

addressを指すメモリブロックは、 vm_allocate/usr/include/mach/vm_map.h)で割り当てる必要があります。

vm_allocateモジュールを含むメモリブロックに使用される要件を必ず順守してください。

オブジェクトファイルイメージを取得したら、NSLinkModule関数を使用してモジュールをプログラムにリンクする必要があります。

この関数を呼び出すと、指定されたモジュールによって参照されるすべてのライブラリがライブラリ検索リストに追加されます。を渡さない限り、モジュール内のすべてのグローバルシンボルをグローバルシンボルリストに追加しますNSLINKMODULE_OPTION_PRIVATENSLinkModule

リンクした後、 NSDestroyObjectFileImage関数を呼び出してクリーンアップすることを忘れないでください。

この関数が呼び出されると、動的ローダーはパラメーターが指すメモリーに対してvm_deallocate( )を呼び出します。/usr/include/mach/vm_map.hobjectFileImage

これらの関数は非推奨ですが、提案された代替案を使用した代替手段は(私の知る限りでは)ないことに注意してくださいdlopen。al。

于 2012-08-06T02:57:42.330 に答える