On 1/23/2015 8:48 AM, Ken Brown wrote:
My guess is correct. lisp.exe uses bit 31 (counting from the LSB) as a marker during garbage collection, and this is incompatible with Cygwin's use of high memory for the heap. I think I know how to fix this (by defining LINUX_NOEXEC_HEAPCODES in the Cygwin build), but I haven't finished testing it yet.
I've now built clisp-2.48 with this change (32-bit only), and I've tested it as well as I can, given that I'm not a clisp user. The build passes all but a handful of about 12,000 tests, so I think it's probably OK. (None of the test failures involved crashes.)
I'm attaching the patches that I applied (on top of Reini's patches) in order to make the build succeed. I also had to use libdb4.5 instead of libdb4.8.
Reini, if you're still lurking, maybe you could take a look at the patches. Ken
--- origsrc/clisp-2.48/src/unix.d 2009-06-17 10:26:40.000000000 -0400 +++ src/clisp-2.48/src/unix.d 2015-01-26 12:11:27.111212000 -0500 @@ -716,7 +716,10 @@ extern int wait2 (PID_T pid); /* see uni /* Interpretation of FILETIME structure: */ #ifdef UNIX_CYGWIN32 #define WIN32_LEAN_AND_MEAN + #pragma push_macro ("Handle") + #undef Handle #include <windows.h> + #pragma pop_macro ("Handle") #undef WIN32 extern long time_t_from_filetime (const FILETIME * ptr); extern void time_t_to_filetime (time_t time_in, FILETIME * out);
--- origsrc/clisp-2.48/src/lispbibl.d 2009-07-28 09:58:03.000000000 -0400 +++ src/clisp-2.48/src/lispbibl.d 2015-01-26 12:14:01.822061000 -0500 @@ -2603,7 +2603,7 @@ Long-Float, Ratio and Complex (only if S malloc results (and hence also of shared libraries) are randomized; only the code address is fixed around 0x1C000000 and the stack address is around 0xCF000000. In this case, we also use LINUX_NOEXEC_HEAPCODES. */ - #if (defined(I80386) && defined(UNIX_LINUX)) || (defined(I80386) && defined(UNIX_OPENBSD) && defined(ADDRESS_RANGE_RANDOMIZED)) + #if (defined(I80386) && defined(UNIX_LINUX)) || (defined(I80386) && defined(UNIX_OPENBSD) && defined(ADDRESS_RANGE_RANDOMIZED)) || (defined(I80386) && defined(UNIX_CYGWIN32)) #define LINUX_NOEXEC_HEAPCODES #else #define STANDARD_HEAPCODES
--- origsrc/clisp-2.48/modules/syscalls/calls.c 2009-07-22 21:12:31.000000000 -0400 +++ src/clisp-2.48/modules/syscalls/calls.c 2015-01-26 12:28:34.091951900 -0500 @@ -3302,6 +3302,7 @@ DEFUN(POSIX::DUPLICATE-HANDLE, old &opti #if defined(WIN32_NATIVE) || defined(UNIX_CYGWIN32) #include <shlobj.h> +#include <shlguid.h> DEFCHECKER(check_file_attributes, type=DWORD, reverse=uint32_to_I, \ default=, prefix=FILE_ATTRIBUTE, bitmasks=both, \ ARCHIVE COMPRESSED :DEVICE :DIRECTORY ENCRYPTED HIDDEN :NORMAL \ --- origsrc/clisp-2.48/modules/syscalls/configure 2009-07-28 12:33:13.000000000 -0400 +++ src/clisp-2.48/modules/syscalls/configure 2015-01-26 12:09:16.528743100 -0500 @@ -4085,7 +4085,7 @@ fi done if test "$ac_cv_header_shlobj_h" = yes ; then - LIBS=${LIBS}' -luser32 -lole32 -loleaut32 -luuid'; + LIBS=${LIBS}' -luser32 -lole32 -loleaut32 -L/usr/lib/w32api -luuid'; fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects