diff --git a/compiler/generic/new-genesis.lisp b/compiler/generic/new-genesis.lisp
index 17ad721b6beb063b1d615dfd66aca50bdaf94fc0..49c629973a497b807b4c001ffa2f0ee55561d4d2 100644
--- a/compiler/generic/new-genesis.lisp
+++ b/compiler/generic/new-genesis.lisp
@@ -4,7 +4,7 @@
 ;;; Carnegie Mellon University, and has been placed in the public domain.
 ;;;
 (ext:file-comment
-  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/generic/new-genesis.lisp,v 1.70 2004/07/25 18:15:52 pmai Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/generic/new-genesis.lisp,v 1.71 2004/08/04 20:29:44 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -906,7 +906,8 @@
 	    (write-indexed fdefn vm:fdefn-raw-addr-slot
 			   (make-random-descriptor
 			    (lookup-foreign-symbol
-			     (vm::extern-alien-name "undefined_tramp")))))
+			     (vm::extern-alien-name "undefined_tramp")
+			     #+sparc :data))))
 	  fdefn))))
   
 (defun cold-fset (name defn)
@@ -926,7 +927,8 @@
 		     (#.vm:closure-header-type
 		      (make-random-descriptor
 		       (lookup-foreign-symbol
-		        (vm::extern-alien-name "closure_tramp"))))))
+		        (vm::extern-alien-name "closure_tramp")
+			#+sparc :data)))))
     fdefn))
 
 (defun initialize-static-fns ()
@@ -1921,12 +1923,12 @@
 		  (setf (gethash name *cold-foreign-symbol-table*) value))))))
       version)))
 
-(defun lookup-foreign-symbol (name)
+(defun lookup-foreign-symbol (name &optional (link-type :code))
   (flet ((lookup-sym (name)
 	   #-linkage-table
 	   (gethash name *cold-foreign-symbol-table* nil)
 	   #+linkage-table
-	   (cold-register-foreign-linkage name :code)))
+	   (cold-register-foreign-linkage name link-type)))
     (let ((linux-p (and (or (eq (c:backend-fasl-file-implementation c:*backend*)
 				#.c:x86-fasl-file-implementation)
 			    (eq (c:backend-fasl-file-implementation c:*backend*)
@@ -1949,7 +1951,20 @@
 	 (let ((value (lookup-sym name)))
 	   (when (and (numberp value) (zerop value))
 	     (warn "Not-really-defined foreign symbol: ~S" name))
-	   value))
+	   value)
+	 #+sparc
+	 (let ((address (lookup-sym name)))
+	   ;; If the link-type is :data, need to lookup and return the
+	   ;; value, not the address of NAME in the linkage table.
+	   ;;
+	   ;; Perhaps we should consider changing how sparc handles
+	   ;; undefined_tramp and closure_tramp?  We could add special
+	   ;; entries for them so that instead of doing
+	   ;; resolve_linkage_tramp stuff, we jump directly to the
+	   ;; routines.
+	   (if (eq link-type :code)
+	       address
+	       (sys:sap-ref-32 (sys:int-sap address) 0))))
 	;; Are those still necessary?
 	((and linux-p (lookup-sym (concatenate 'string "__libc_" name))))
 	((and linux-p (lookup-sym (concatenate 'string "__" name))))