2

morag.dll関数 foo と bar を含むWindows DLL があります。また、foo と bar の Linux 実装を含む Linux SO と呼ばれるものもmorag.soあります (各プラットフォームで同じパラメーター)。morag.dllwine で実行したいロードする Windows アプリケーションがあります。morag.dllアプリケーション自体は正常に動作しますが、代わりに foo と bar in を使用するために、アプリケーションで見つかると予想される foo と bar の間のマッピングを作成する必要がありますmorag.so

これを行うには、morag.dll.specファイルを作成し、それを winebuild にする必要があることを知っていますmorag.dll.so

hereの指示に従って、関数をmorag.c含むラッパーを作成しました。これは、実際の関数 foo と bar を呼び出すだけです。それから私はこのように作成しました:-ProxyfooProxybarmorag.dll.spec

1 stdcall foo (long ptr) Proxyfoo
2 stdcall bar (ptr ptr)  Proxybar

c 部分をコンパイルし、spec ファイルを winebuild してから、winegcc を使用してそれらをリンクします。morag.dll.so

次に、プロキシ機能が必要ない可能性があることを示唆するこのページを読んだので、c部分を完全に使用せずに試し、次のように仕様ファイルを作成しました:-

1 stdcall foo (long ptr)
2 stdcall bar (ptr ptr)

上記のように、winebuild ステップと winegcc リンクステップを実行しました。

どちらの場合も、これらは私が使用したオプションです。

winebuild --dll -m32 -E ./morag.dll.spec -o morag.dll.o

ldopts= -m32 -fPIC -shared -L/usr/lib/wine -L/opt/morag/lib -lmorag

winegcc $(ldopts) -z muldefs -o morag.dll.so [morag.o] morag.dll.o

NB [..] は、c 部分もビルドしている場合にのみこれを使用したことを示します。

どちらの場合も、wine で実行しているアプリケーションが、それを使用して DLL のエントリ ポイントを読み込もうとするGetProcAddressと失敗します。

私はワインを実行しWINEDEBUG=+module,+relay、試行と失敗が次のように記録されているのを見ました:-

0025:Ret  KERNEL32.LoadLibraryExA() retval=7dbc0000 ret=00447b84
0025:Call KERNEL32.GetProcAddress(7dbc0000,00b2d060 "foo") ret=00447c8a
0025:Ret  KERNEL32.GetProcAddress() retval=00000000 ret=00447c8a

morag.dll.soハンドルを返したので、 my を見つけてロードLoadLibraryExAしたようですが、その HMODULE ハンドル内で関数 foo を見つけようとすると失敗します。

私が発行した場合:-

nm -D morag.dll.so

どちらの場合も、foo と bar が U として表示されます。プロキシ機能もある場合は、プロキシ機能を T と表記します。

これはmorag.dll.so、間違ったオプションを使用してファイルを正しくビルドしていないか、仕様ファイルが正しく形成されていないためだと思います。上記の 2 つのスキームのどちらを使用すればよいかわかりません。

すべてのヘルプが最も高く評価されています。

4

1 に答える 1