The LightSpeed C on the Macintosh evidently pushes some 16-bit quantities on the stack. Therefore you need an additional mark_locations pass with an offset of 2 bytes, as recommended in the documentation. gc_mark_and_sweep() {LISP stack_end; gc_ms_stats_start(); /* This assumes that all registers are saved into the jmp_buff */ setjmp(save_regs_gc_mark); mark_locations((LISP *)save_regs_gc_mark, ((LISP *) save_regs_gc_mark) + sizeof(save_regs_gc_mark)); mark_protected_registers(); mark_locations((LISP *)stack_start_ptr,(LISP *)&stack_end); /* Here is the additional code to handle the 16-bit alignment */ mark_locations((LISP *)((char *)stack_start_ptr+2), (LISP *)((char *)&stack_end+2)); gc_sweep(); gc_ms_stats_end();}