Что делает rebayall в Cygwin?

При столкновении ошибок dll/forking в cygwin я вызываю rebaseall script, и все волшебство снова работает. Я знаю, что он каким-то образом изменяет DLL в установке cygwin, потому что я запускаю разницу между проблемными и перезаписанными.

Что он точно изменяет в этих двоичных файлах и заставляет их работать снова?

Ответ 1

В соответствии с Сообщения об ошибках в базовых адресах модуля:

DLL в Windows необходимо загружать в память на неконфликтных базовых адресах. rebaseall - это утилита cygwin, которая сканирует все установленные в настоящее время библиотеки и устанавливает, что каждый запрашивает другой базовый адрес, чтобы никто не конфликтует.

Немного больше технического объяснения от Обработка повторяющихся сбоев rebaseall, позволяющих перепрофилировать cygwin:

Из-за семантики unix fork (предположительно) библиотеки cygwin должны быть сопоставлены в одном и том же месте как в родительском, так и в дочернем полях fork. Все библиотеки cygwin имеют в себе подсказки о том, где они должны отображаться в адресном пространстве процессов; если следовать этим намекам, каждая библиотека будет отображаться в одном месте в обоих адресных пространствах. Однако Windows отлично справляется с отображением DLL в любом месте в адресном пространстве; подсказка не считается контрольной. Ошибка переназначения возникает, когда запускается процесс cygwin, и одна из его библиотек не может быть сопоставлена ​​с местоположением, указанным его подсказкой.

/usr/bin/rebaseall изменяет подсказки DLL для всех библиотек cygwin, чтобы не было конфликтов между библиотеками; он делает это, выбирая смежную, но не перекрывающуюся структуру библиотеки, начиная с базового адреса и работая вниз. Этот процесс гарантирует отсутствие конфликтов внутри cygwin, но не может справиться с конфликтами с внешними DLL, которые находятся в адресных пространствах процессов cygwin (например, антивирусных DLL).