Use cygwin executable in git bash script

Use cygwin executable in git bash script

I have a .sh script that I double-click to have it executed by git for Windows.

Now I need (imagemagick) convert from cygwin (which I have installed) and I'm calling it with its absolute path - /c/cygwin64/bin/convert.exe - but I get:

fatal error - cygheap base mismatch detected. This problem is probably due to using incompatible versions of the cygwin DLL.

Wrapping the actual convert call in a cygwin bash call, or even in a cmd.exe call, doesn't help. This is a bit strange because I sometimes use cygwin executables directly in .cmd scripts, and that always worked.

What can I do? A solution that keeps my program limited to one file would be preferred.

(I know I could probably just install Windows-native imagemagick. But then the next day I need another cygwin tool in a git-for-Win-Shellscript .. also, I'd like to understand what's happening here. And, yes, I will probably make git for Windows obsolete in my workplace, if possible)

答案1

fatal error - cygheap base mismatch detected.

This problem is probably due to using incompatible versions of the cygwin DLL.

This error is caused because the Git for Windows path is incompatible with Cywin.

  • They both use /bin and /usr/bin but these map to different directories (because they use different mount tables).

  • Cywin expects to find the dll in /usr/bin/cygwin1.dll (and is not found in Git for Windows)

  • When you explicitly run any Cygwin command in a Git for Windows bash shell Cygwin cannot find its dll and generates the error message above.

  • Notice below that the mount mapping for / is different.

Git for Windows:

DavidPostill@Hal MINGW64 ~
$ mount
C:/temp on /tmp type ntfs (binary,noacl,posix=0,usertemp)
C:/apps/Git on / type ntfs (binary,noacl,auto)
C:/apps/Git/usr/bin on /bin type ntfs (binary,noacl,auto)
C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto)
E: on /e type vfat (binary,noacl,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,noacl,posix=0,user,noumount,auto)

DavidPostill@Hal MINGW64 ~
$ which cygwin1.dll
which: no cygwin1.dll in (/c/Users/DavidPostill/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/DavidPostill/bin:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/apps/WSCC/Sysinternals Suite:/c/apps/WSCC/NirSoft Utilities:/c/apps/Calibre:/cmd:/mingw64/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl)

DavidPostill@Hal MINGW64 ~
$ /c/cygwin/bin/man
      1 [main] man (608) C:\cygwin\bin\man.exe: *** fatal error - cygheap base mismatch detected - 0x180301408/0x180304408.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version.  The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution.  Rebooting is also suggested if you
are unable to find another cygwin DLL.
Segmentation fault

Cygwin:

$ mount
C:/cygwin/bin on /usr/bin type ntfs (binary,auto)
C:/cygwin/lib on /usr/lib type ntfs (binary,auto)
C:/cygwin on / type ntfs (binary,auto)
C: on /c type ntfs (binary,posix=0,user,noumount,auto)
E: on /e type vfat (binary,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,posix=0,user,noumount,auto)
$ which cygwin1.dll
/usr/bin/cygwin1.dll
$ /c/cygwin/bin/man
What manual page do you want?

There is no solution, other than don't mix and match cygwin derived utilities. Pick one and stick with it.

答案2

I had the same problem on Windows 10. I was wondering how is it possible to have plenty of versions of CygWin, while I can't find even one cygwin.dll. GitExtensions->Stash and Git Bash were crashed with different error messages. Solution is here: Go to Windows Defender -> App & browser control -> Exploit protection. And switch off three options with ASLR. You have to restart your system thereafter, but it really helps!

相关内容