diff --git a/lisp/save.c b/lisp/save.c index a57c21bae4fac7c9c281d9ec125533efa471582f..4841478701a440ba307bb2485dda30693e29bfe7 100644 --- a/lisp/save.c +++ b/lisp/save.c @@ -1,6 +1,6 @@ /* - $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/save.c,v 1.21 2008/12/10 16:16:11 rtoy Exp $ + $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/save.c,v 1.22 2009/09/28 12:32:42 rtoy Rel $ This code was written as part of the CMU Common Lisp project at Carnegie Mellon University, and has been placed in the public domain. @@ -247,6 +247,7 @@ save(char *filename, lispobj init_function, int sse2_mode) boolean save_executable(char *filename, lispobj init_function) { + char *dir_name; #if defined WANT_CGC volatile lispobj *func_ptr = &init_function; @@ -269,6 +270,8 @@ save_executable(char *filename, lispobj init_function) if(SymbolValue(X86_CGC_ACTIVE_P) != NIL) SetSymbolValue(ALLOCATION_POINTER, DYNAMIC_0_SPACE_START); #endif + dir_name = dirname(strdup(filename)); + printf("[Undoing binding stack... "); fflush(stdout); unbind_to_here((lispobj *)BINDING_STACK_START); @@ -285,11 +288,11 @@ save_executable(char *filename, lispobj init_function) fflush(stdout); printf("read-only... "); fflush(stdout); - write_elf_object(dirname(filename), READ_ONLY_SPACE_ID, (os_vm_address_t)read_only_space, + write_elf_object(dir_name, READ_ONLY_SPACE_ID, (os_vm_address_t)read_only_space, (os_vm_address_t)SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); printf("static... "); fflush(stdout); - write_elf_object(dirname(filename), STATIC_SPACE_ID, (os_vm_address_t)static_space, + write_elf_object(dir_name, STATIC_SPACE_ID, (os_vm_address_t)static_space, (os_vm_address_t)SymbolValue(STATIC_SPACE_FREE_POINTER)); #ifdef GENCGC /* Flush the current_region updating the tables. */ @@ -345,10 +348,10 @@ save_executable(char *filename, lispobj init_function) printf("dynamic... "); fflush(stdout); #ifdef reg_ALLOC - write_elf_object(dirname(filename), DYNAMIC_SPACE_ID, (os_vm_address_t)current_dynamic_space, + write_elf_object(dir_name, DYNAMIC_SPACE_ID, (os_vm_address_t)current_dynamic_space, (os_vm_address_t)current_dynamic_space_free_pointer); #else - write_elf_object(dirname(filename), DYNAMIC_SPACE_ID, (os_vm_address_t)current_dynamic_space, + write_elf_object(dir_name, DYNAMIC_SPACE_ID, (os_vm_address_t)current_dynamic_space, (os_vm_address_t)SymbolValue(ALLOCATION_POINTER)); #endif @@ -358,7 +361,7 @@ save_executable(char *filename, lispobj init_function) printf("Linking executable...\n"); fflush(stdout); elf_run_linker(init_function, filename); - elf_cleanup(dirname(filename)); + elf_cleanup(dir_name); printf("done.\n"); exit(0); diff --git a/tools/linker.sh b/tools/linker.sh index 85db01e9cc389520e4de5a1daf74a5558bf79f0e..378315a8b5531b3c9279e60d6acf7ddcf929bb76 100755 --- a/tools/linker.sh +++ b/tools/linker.sh @@ -1,6 +1,6 @@ #!/bin/sh -x -# $Id: linker.sh,v 1.7 2007/08/14 15:57:48 rtoy Exp $ +# $Id: linker.sh,v 1.8 2009/09/28 12:32:42 rtoy Rel $ # This file was written by Fred Gilham and is placed in the public domain. # It comes without warranty of any kind. @@ -51,6 +51,9 @@ VER='' # Default values OUTPUT="-o $2" +OUTDIR=`dirname $2` +CURDIR=`pwd` + LINKER=/usr/bin/ld CMUCLLIB=`dirname $0` OBJS="--whole-archive $CMUCLLIB/lisp.a --no-whole-archive" @@ -128,6 +131,8 @@ case "$OPSYS" in ;; esac +cd $OUTDIR $LINKER $SCRIPT $DLINKER $OUTPUT $STARTCRT $FLAGS $BIFLAG $IFADDR $OBJS $LIBS $ENDCRT +cd $CURDIR exit 0