From b722d46efd3dc068d0688a2b58a13344eba0db1b Mon Sep 17 00:00:00 2001
From: fgilham <fgilham>
Date: Thu, 12 Jul 2007 04:50:22 +0000
Subject: [PATCH] Fix script so it will work with different versions of Linux
 (with any luck).

---
 tools/linker.sh | 102 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 76 insertions(+), 26 deletions(-)

diff --git a/tools/linker.sh b/tools/linker.sh
index 9da4873cd..b4e3513f7 100755
--- a/tools/linker.sh
+++ b/tools/linker.sh
@@ -1,10 +1,63 @@
 #!/bin/sh -x
 
-# $Id: linker.sh,v 1.1 2007/07/07 16:00:49 fgilham Exp $
+# $Id: linker.sh,v 1.2 2007/07/12 04:50:22 fgilham Exp $
 
 # This file was written by Fred Gilham and is placed in the public domain.
 # It comes without warranty of any kind.
 
+PATH=/bin:/usr/bin:/usr/local/bin
+
+GCC=`which gcc`
+
+if [ -z "$GCC" ]
+    then
+    echo 'Cannot find GCC.  How did you build lisp?'
+    exit 1
+fi
+
+set_libroot()
+{
+    LIBROOT=`$GCC -v 2>&1 | \
+	grep 'Reading' | \
+	sed -e 's/Reading specs from //' | \
+	sed -e 's|/specs||'`
+
+    echo "LIBROOT is $LIBROOT"
+}
+
+
+find_libroot()
+{
+    LIBROOT=''
+    GCC_VERSION=`$GCC -v 2>&1 | \
+     grep 'gcc version' | \
+     sed -e 's/gcc version //' | \
+     sed -e 's/ .*//'`
+    if [ -z "$GCC_VERSION" ]; then
+	echo "Can't get the version from GCC.  Something is very wrong."
+	exit 1
+    fi
+
+    CRT_DIR=`find /usr/lib -name $GCC_VERSION -print`
+
+    if [ -f $CRT_DIR/crtbegin.o ] && [ -f $CRT_DIR/crtend.o ]; then
+	LIBROOT=$CRT_DIR
+    else
+	if [ -f /usr/lib/crtbegin.o ] && [ -f /usr/lib/crtend.o ]; then
+	    # I doubt that this is right.  After all, this is Linux.  You
+	    # don't expect to find things in reasonable places.
+	    LIBROOT=/usr/lib
+	fi
+    fi
+
+    if [ -z $LIBROOT ]; then
+	echo "Can't find the directory with the C runtime object files.  Exiting."
+	exit 1
+    fi
+
+    echo "LIBROOT is $LIBROOT"
+}
+
 if [ $# -ne 2 ]
     then
     echo "Usage: `basename $0` <initial function address> <executable file>"
@@ -12,35 +65,30 @@ if [ $# -ne 2 ]
 fi
 
 OPSYS=`uname`
-VER=""
+VER=''
 
-# Set OS-specific variables.  Things marked XXXX can possibly change
-# with different operationg systems, different distributions (Linux)
-# or different releases (FreeBSD).
+# Set OS-specific variables.
 case "$OPSYS" in
     Linux )
-	# XXXX  This can change depending on any number of things....
-	LIBROOT=/usr/lib/gcc-lib/i386-redhat-linux/2.96
-	DLINKER="-dynamic-linker /lib/ld-linux.so.2"
+	# See if this is a version of Linux where GCC reports
+	# where it gets the specs from.  Extract the location of
+	# the C runtime object files from that.
+	set_libroot
+	if [ -z "$LIBROOT" ]; then
+	    # We have to do it the hard way.
+	    find_libroot
+	fi
+	DLINKER='-dynamic-linker /lib/ld-linux.so.2'
 	STARTCRT="$LIBROOT/../../../crt1.o $LIBROOT/../../../crti.o $LIBROOT/crtbegin.o"
 	ENDCRT="$LIBROOT/crtend.o $LIBROOT/../../../crtn.o"
 	LIBS="-L$LIBROOT -ldl -lm -lgcc -lc -lgcc"
 	;;
     FreeBSD )
-	# XXXX I guess we have to just keep adding to this.
-	# XXXXX Maybe not.  Seems like there's more compatibility than I
-	# thought between binary versions.
-	RELEASE=`uname -r`
-#	case $RELEASE in
-#	    4* ) VER=4 ;;
-#	    5* ) VER=5 ;;
-#	    *  ) echo "$0: unknown FreeBSD version $RELEASE" ; exit 1 ;;
-#	esac
 	LIBROOT=/usr/lib
-	DLINKER="-dynamic-linker /usr/libexec/ld-elf.so.1"
+	DLINKER='-dynamic-linker /usr/libexec/ld-elf.so.1'
 	STARTCRT="$LIBROOT/crt1.o $LIBROOT/crti.o $LIBROOT/crtbegin.o"
 	ENDCRT="$LIBROOT/crtend.o $LIBROOT/crtn.o"
-	LIBS="-lm -lgcc -lc -lgcc"
+	LIBS='-lm -lgcc -lc -lgcc'
 	;;
     * )
 	echo "$0: unknown operating system $OPSYS."
@@ -52,21 +100,23 @@ OUTPUT="-o $2"
 LINKER=/usr/bin/ld
 CMUCLLIB=`dirname $0`
 OBJS="--whole-archive $CMUCLLIB/lisp.a --no-whole-archive"
-FLAGS="-export-dynamic"
+FLAGS='-export-dynamic'
 
-# XXXX The linker script is a nasty portability issue. 
 SCRIPT="-T $CMUCLLIB/$OPSYS$VER-cmucl-linker-script"
 
-# BIFLAG flags the executable as having a builtin lisp image.  It
-# should be a valid address because it will be dereferenced.  It
-# should also not point to an integer 0. We use the first address in
-# the process memory image, which should point to the ELF header.
+# This is a hack.
+# BIFLAG flags the executable as having a builtin lisp image.  It should be
+# a valid address because it will be dereferenced.  It should also not point
+# to an integer 0 because that would make the flag false. We use the first
+# address in the process memory image, which should point to the ELF header.
 
 # XXXX The process image start address can change depending on the OS
 # (at least).
-BIFLAG="--defsym builtin_image_flag=0x08048000"
+BIFLAG='--defsym builtin_image_flag=0x08048000'
 
 # IFADDR is the initial function address, needed to start lisp processing.
 IFADDR="--defsym initial_function_addr=$1"
 
 $LINKER $SCRIPT $DLINKER $OUTPUT $STARTCRT $FLAGS $BIFLAG $IFADDR $OBJS $LIBS $ENDCRT
+
+exit 0
-- 
GitLab