Erro fatal Cygwin incapaz de remapear .. O que isso significa?

30

Ao executar python no cygwin, recebo o seguinte erro:

    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

O que significa e o que devo fazer para corrigir isso?

    
por Jon Erickson 30.09.2010 / 20:51

4 respostas

40

Você precisa executar o comando rebaseall do pacote rebase para corrigir o problema.

  1. Instale o pacote rebase usando o utilitário Cygwin setup.exe
  2. Feche tudo que estiver em execução e use o cygwin1.dll
  3. Abra um shell do Cygwin
  4. Digite rebaseall no prompt

O re-armazenamento geralmente é necessário apenas quando pacotes instalados são instalados que modificam bibliotecas que são carregadas dinamicamente. Eu admito o mau hábito de sempre executar rebaseall após instalar ou atualizar pacotes em uma instalação do Cygwin, em vez de esperar que o erro que você atingiu seja exibido.

Quanto a por que você recebeu esse erro e como o rebasing resolve o problema, este post tem isto a dizer sobre isso:

You have it backwards. Forking doesn't break the relocation. Relocation breaks forking. cygwin1.dll needs to have a very special memory layout to implement the fork semantics in Win32. If this memory layout is disrupted, fork breaks. Relocating cygwin1.dll disrupts the required memory layout. 'rebaseall' does its best to locate all Cygwin DLLs that it knows of into a layout that avoids collisions. This maintains the required memory layout so fork can do its job.

    
por 30.09.2010 / 21:22
10

Isso significa que um programa de terceiros, como um verificador de vírus ou o recurso de randomização de endereços de DLL que foi introduzido no Vista, interferiu em seu processo de modo que ele não pudesse ser bifurcado com êxito.

O utilitário rebaseall pode ser usado para fixar DLLs de modo que o problema seja evitado. Está instalado por padrão. Veja rebaseall --help sobre como usá-lo e /usr/share/doc/Cygwin/rebase-3.0.1.README para mais detalhes. Se isso não ajudar, peflagsall é outro que vale a pena tentar.

    
por 30.09.2010 / 21:23
5

Eu tive o mesmo problema depois de compilar "numpy". Die afetado dll foi mtrand.dll. Simples

$ /bin/rebaseall

não funcionou.

O que ajudou foi o seguinte: Examine se a dll afetada (neste caso, time.dll) é "rebased" de forma ativa:

$ /bin/rebaseall -v

Se não criar uma lista que contenha o caminho completo da dll afetada. Por exemplo:

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

O arquivo também pode conter mais dlls, um por linha. Então, ligue para

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

sem nenhum outro material cygwin em execução, conforme descrito acima. O time.dll deve agora ser rebased (adicionalmente ao rebaseall "normal").

(Estranho: Em 10 anos usando o cygwin com nt, windows2000, xp, tive que "rebaseizar" apenas uma vez. Em um dia com a janela (64 bits) -7 isso já era necessário.)

    
por 07.09.2011 / 17:44
2

Existe resposta para o problema.

Fonte: link

Não é possível mapear para o mesmo endereço que o pai

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

Isso também não é um problema com node.js. Instale base → rebase usando setup.exe primeiro e feche todas as instâncias do Cygwin. Inicie o dash ou ash (localizado no diretório bin sob a instalação do Cygwin) e execute:

$ /bin/rebaseall -v

Deve terminar sem erros. Se, em vez disso, o resultado acima resultar em um erro como:

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

Abra um shell do Cygwin e execute:

$ chmod 777 ~/AppData/Local/Temp

Feche a janela do seu shell e repita as etapas acima. Quando terminar, reinicie o seu PC. Lembre-se de fechar todos os shells do Cygwin antes de usar o rebaseal.

    
por 21.06.2011 / 15:31