2015-10-14 31 views
8

Podczas próby dll/rozwidlenia błędów w cygwin, dzwonię do skryptu rebaseall i wszystko w magiczny sposób działa ponownie. Wiem, że w jakiś sposób modyfikuje biblioteki DLL w instalacji cygwin, ponieważ uruchomiłem diff pomiędzy tymi problematycznymi i opartymi na rebased.Co robi rebaseall w Cygwin?

Co dokładnie modyfikuje w tych plikach binarnych i sprawia, że ​​znowu działają?

Odpowiedz

11

Według Error messages about module base addresses:

DLL w systemie Windows musi być załadowany do pamięci w niewyspecjalizowanych konflikt adresów bazowych. rebaseall to narzędzie cygwin, które skanuje wszystkie aktualnie zainstalowane biblioteki i ustawia je tak, aby żądały innego adresu bazowego, aby żadna nie była w konflikcie.

Nieco bardziej techniczne wyjaśnienie od Handling repeated failures of rebaseall to allow cygwin remaps:

Ponieważ Uniksa semantyki wideł (przypuszczalnie), biblioteki Cygwin musi być odwzorowywane w tej samej lokalizacji, zarówno rodzic i dziecko widelcem. Wszystkie biblioteki cygwin zawierają wskazówki, gdzie należy je zmapować w przestrzeni adresowej procesów; jeśli te wskazówki będą przestrzegane, każda biblioteka będzie mapowana w tej samej lokalizacji w obu przestrzeniach adresowych. Jednak system Windows jest całkowicie zadowolony z mapowania biblioteki DLL w dowolnym miejscu w przestrzeni adresowej; wskazówka nie jest uważana za kontrolującą. Błąd odwzorowania pojawia się, gdy rozpoczyna się proces cygwin, a jednej z jego bibliotek nie można zmapować do lokalizacji określonej przez podpowiedź.

/usr/bin/rebaseall zmienia wskazówki DLL dla wszystkich bibliotek cygwin, dzięki czemu nie ma konfliktów między bibliotekami; robi to poprzez wybór ciągłego, ale nie nakładającego się układu biblioteki, zaczynającego się od adresu bazowego i pracującego w dół. Proces ten zapewnia, że ​​nie ma konfliktów wewnątrz-cygwin, ale nie radzi sobie z konfliktami z zewnętrznymi bibliotekami DLL, które znajdują się w przestrzeniach adresowych procesu cygwin (np. Antywirusowe biblioteki DLL).

+0

Dokładnie to, czego chciałem się nauczyć! – Fr0stBit