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

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

4 ответа4

40

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

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

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

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

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

10

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

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

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .