Роковая ошибка Cygwin не удается переназначить .. Что это значит?

30

При запуске pythonв Cygwin я получаю следующую ошибку:

    0 [main] python 6140 C:\cygwin\bin\python.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\python2.6\lib-dynload\time.dll to same address as parent: 0x2B0000 != 0x360000
Stack trace:
Frame     Function  Args
00288E68  6102749B  (00288E68, 00000000, 00000000, 00000000)
00289158  6102749B  (61177B80, 00008000, 00000000, 61179977)
0028A188  61004AFB  (611A136C, 6124112C, 002B0000, 00360000)
End of stack trace
    0 [main] python 9048 fork: child 6140 - died waiting for dll loading, errno 11
abort: Resource temporarily unavailable

Что это значит, и что я должен сделать, чтобы это исправить?

Джон Эриксон
источник

Ответы:

40

Вам нужно запустить rebaseallкоманду из rebaseпакета, чтобы исправить проблему.

  1. Установите rebaseпакет с помощью setup.exeутилиты Cygwin
  2. Закройте все работающие, которые используют cygwin1.dll
  3. Откройте оболочку Cygwin
  4. Введите rebaseallв командной строке

Перебазирование обычно требуется только тогда, когда установлены установленные пакеты, которые изменяют библиотеки, которые загружаются динамически. Я признаю плохую привычку всегда запускаться rebaseallпосле установки или обновления пакетов при установке Cygwin, а не ждать появления ошибки, которую вы нажали.

Что касается того, почему вы получили эту ошибку и как перебазировка решает проблему, в этом посте об этом сказано:

У вас есть это задом наперед. Форкинг не нарушает переезд. Переезд перерывы разветвления. Для реализации семантики разветвлений в Win32 у cygwin1.dll должна быть очень специальная схема памяти. Если этот макет памяти нарушен, вилка ломается. Перемещение cygwin1.dll нарушает требуемую структуру памяти. 'rebaseall' делает все возможное, чтобы найти все библиотеки Cygwin, о которых он знает, в макете, позволяющем избежать коллизий. Это поддерживает требуемую структуру памяти, поэтому fork может выполнять свою работу.

Ян С.
источник
1
Я пытался это, и это не сработало ... пока я не перезапустил Windows (после rebaseall и peflagsall)
Джон Эриксон,
Ян C: Ты мой герой!
Стефан Русек
Кроме того, кажется, что rebaseall нужны права администратора в Windows 7.
xtofl
Смешение базового адреса в некоторых случаях может помочь, как предлагается здесь: cygwin.com/ml/cygwin/2011-04/msg00306.html
lapo
2
Вы должны сделать это в золе или в тире, а не через обычный терминал Cygwin. Запустите его с помощью Start -> Run, его в cygwin \ usr \ bin \ ash. После запуска программы введите / usr / bin / rebaseall и нажмите Enter.
Maciej Swic
10

Это означает, что либо сторонняя программа, такая как антивирусный сканер или функция рандомизации адресов DLL, которая была представлена ​​в Vista, вмешивалась в ваш процесс таким образом, что его нельзя было успешно разбудить.

rebaseallУтилита может быть использована для придавить библиотеки DLL таким образом, что эта проблема устраняется. Он установлен по умолчанию. Посмотрите, rebaseall --helpкак использовать это, и /usr/share/doc/Cygwin/rebase-3.0.1.READMEдля получения дополнительной информации. Если это не поможет, peflagsallстоит попробовать.

ak2
источник
спасибо =) оба ответа помогли мне ... но я могу принять только один = \
Джон Эриксон
5

У меня была такая же проблема после компиляции "numpy". Умирают пострадавшие dll, был mtrand.dll. просто

$ /bin/rebaseall

не работал.

Что помогло, было следующее: Проверьте, является ли затронутая dll (в данном случае time.dll) на самом деле «перебазирована»:

$ /bin/rebaseall -v

Если нет, создайте список, который содержит полный путь затронутой DLL. Например:

$ find /lib -name 'time.dll' > /tmp/mydll.txt

Файл может также содержать больше dll, по одному на строку. Затем позвоните

$ /bin/rebaseall -v -T /tmp/mydll.txt

без других запущенных вещей Cygwin, как описано выше. Time.dll теперь должен быть перебазирован (в дополнение к "обычному" rebaseall).

(Странно: за 10 лет использования cygwin с nt, windows2000, xp мне пришлось «перебазировать» только один раз. За один день с (64-битным) окном-7 это уже было необходимо.)

Себастьян Сор
источник
2

Есть ответ на проблему.

Источник: https://github.com/joyent/node/wiki/Building-node.js-on-Cygwin-(Windows)


Невозможно переназначить на тот же адрес, что и родительский

fatal error – unable to remap \?\C:\cygwin\lib\python2.6\lib-dynload\time.dll to same address as parent: 0×360000 != 0×3E0000

Это не проблема с node.js. Сначала установите base → rebase, используя setup.exe, затем закройте все экземпляры Cygwin. Запустите dash или ash (находится в каталоге bin под установкой Cygwin) и запустите:

$ /bin/rebaseall -v

Это должно закончиться без ошибок. Если вместо этого выше приводит к ошибке, как:

rebaseall:'/cygdrive/c/Users/ADMINI~1/AppData/Local/Temp' is not writable

Откройте оболочку Cygwin и запустите:

$ chmod 777 ~/AppData/Local/Temp

Закройте окно вашей оболочки и повторите шаги, описанные выше. Как только вы закончите, перезагрузите компьютер. Не забудьте закрыть все открытые оболочки Cygwin перед использованием rebaseall.

TunWN
источник
Рекомендуется скопировать информацию из ссылки для будущих пользователей в случае сбоя ссылки.
paradd0x