From 95322e54cacfb2616d5e2c6bd3c0d49cf7a62d02 Mon Sep 17 00:00:00 2001 From: rtoy <rtoy> Date: Mon, 28 Sep 2009 12:32:42 +0000 Subject: [PATCH] From A.M.Raportirenko, on cmucl-imp, Sep 25, 2009: dirname destructively modifies its argument. lisp/save.c: o Call dirname once, saving the result, and use it everywhere. --- lisp/save.c | 15 +++++++++------ tools/linker.sh | 7 ++++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lisp/save.c b/lisp/save.c index a57c21bae..484147870 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 85db01e9c..378315a8b 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 -- GitLab