2015-10-14 14 views
8

Quando si urta in DLL/errori di forking in cygwin, sto chiamando lo script rebaseall e tutto funziona magicamente di nuovo. So che modifica in qualche modo le DLL nell'installazione di cygwin perché ho eseguito un diff tra quelli problematici e quelli successivi.Cosa fa rebaseall in Cygwin?

Che cosa modifica esattamente in questi file binari e li fa funzionare di nuovo?

risposta

11

Secondo Error messages about module base addresses:

DLL per Windows hanno bisogno di essere caricato in memoria a indirizzi non in conflitto di base. rebaseall è un'utilità cygwin che analizza tutte le librerie attualmente installate e imposta ciascuna per richiedere un indirizzo di base diverso in modo che nessuno possa entrare in conflitto.

Un po 'più spiegazione tecnica da Handling repeated failures of rebaseall to allow cygwin remaps:

causa delle semantiche forcella UNIX (presumibilmente), librerie cygwin devono essere mappati nella stessa posizione sia ascendenti e discendenti di una forcella. Tutte le librerie cygwin hanno suggerimenti su dove dovrebbero essere mappate nello spazio degli indirizzi dei processi; se tali suggerimenti vengono seguiti, ciascuna libreria verrà mappata nella stessa posizione in entrambi gli spazi degli indirizzi. Tuttavia, Windows è perfettamente felice nel mappare una DLL ovunque nello spazio degli indirizzi; il suggerimento non è considerato di controllo. L'errore di rimappatura si verifica all'avvio di un processo cygwin e non è possibile mappare una delle sue librerie nella posizione specificata dal relativo suggerimento.

/usr/bin/rebaseall modifica i suggerimenti DLL per tutte le librerie cygwin in modo che non vi siano conflitti tra librerie; lo fa scegliendo un layout di libreria contiguo ma non sovrapposto a partire da un indirizzo di base e funzionante. Questo processo fa in modo che non vi siano conflitti intra-cygwin, ma non può gestire conflitti con DLL esterne che si trovano negli spazi degli indirizzi del processo cygwin (ad esempio le DLL anti-virus).

+0

Esattamente quello che volevo imparare! – Fr0stBit