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