2015-10-14 9 views
8

cygwinでdll/forkingエラーが発生したら、私はrebaseallというスクリプトを呼び出しています。問題のあるものとリベースされたものとの間でdiffを実行したので、cygwinのインストールで何とかdllを変更することが分かります。Cygwinのrebaseallは何をしますか?

これらのバイナリファイルで正確に何が変更され、再び機能するのですか? Error messages about module base addressesによると

答えて

11

:Windows上

DLLは、非競合ベースアドレスでメモリにロードする必要があります。 rebaseallは、現在インストールされているすべてのライブラリをスキャンし、異なるベースアドレスを要求するように設定するcygwinユーティリティで、競合しないようにします。

Handling repeated failures of rebaseall to allow cygwin remapsからもう少し技術的説明:ためUNIXフォークセマンティクス(おそらく)の

、cygwinのライブラリーは、フォークの親と子の両方で同じ位置にマッピングされなければなりません。すべてのcygwinライブラリには、プロセスのアドレス空間でどこにマップされるべきかに関するヒントがあります。これらのヒントに従うと、各ライブラリは両方のアドレス空間の同じ場所にマップされます。しかし、Windowsはアドレス空間のどこにでもDLLを完全にマッピングすることができます。ヒントはコントロールと見なされません。再マッピングエラーは、cygwinプロセスが起動し、そのライブラリの1つがそのヒントで指定された場所にマップできない場合に発生します。

/usr/bin/rebaseallは、ライブラリ間の競合がないように、すべてのcygwinライブラリのDLLヒントを変更します。オーバーレイしていない連続したライブラリレイアウトを選択することで、これを行います。このプロセスは、cygwin内の競合がないことを確認しますが、cygwinプロセスのアドレス空間にある外部DLL(例えば、アンチウイルスDLL)との競合を処理することはできません。

+0

正確に何を学びたいのですか? – Fr0stBit

関連する問題