diff --git a/compiler/generic/new-genesis.lisp b/compiler/generic/new-genesis.lisp
index 4294d1a81fba435f0894d4ef73deb6f4acbf3690..0f92646a82854ba1f722bf871116b2ca5f7155e0 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.80 2008/02/09 13:51:32 rtoy Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/generic/new-genesis.lisp,v 1.81 2008/09/12 21:02:56 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -956,6 +956,23 @@
      (or (gethash (descriptor-bits des) *cold-symbols*)
 	 (descriptor-bits des)))))
 
+;; Need to handle special symbols specially on sparc and ppc.  The
+;; special symbols are undefined_tramp and closure_tramp.  We need to
+;; use the current C values of these and not the values in the current
+;; running lisp.  Why?  Because new C code may have moved these
+;; addresses so we need to use the right values.  We get worldbuild
+;; issues if we use the old values that don't match.
+#-(and linkage-table (or sparc ppc))
+(defun lookup-special-symbol (name)
+  (lookup-foreign-symbol (vm::extern-alien-name name)
+			 #+(or sparc ppc) :data))
+
+#+(and linkage-table (or sparc ppc))
+(defun lookup-special-symbol (name &optional (link-type :code))
+  (or (gethash name *cold-foreign-symbol-table* nil)
+      (lookup-foreign-symbol (vm::extern-alien-name name)
+			     link-type)))
+  
 (defun cold-fdefinition-object (name &optional leave-fn-raw)
   (let ((hash (extract-fdefn-name name)))
     (or (gethash hash *fdefn-objects*)
@@ -970,9 +987,8 @@
 	    (write-indexed fdefn vm:fdefn-function-slot *nil-descriptor*)
 	    (write-indexed fdefn vm:fdefn-raw-addr-slot
 			   (make-random-descriptor
-			    (lookup-foreign-symbol
-			     (vm::extern-alien-name "undefined_tramp")
-			     #+(or sparc ppc) :data))))
+			    (lookup-special-symbol "undefined_tramp"
+						   #+(or sparc ppc) :data))))
 	  fdefn))))
   
 (defun cold-fset (name defn)
@@ -990,9 +1006,8 @@
 			      (ash vm:function-code-offset vm:word-shift)))))
 		     (#.vm:closure-header-type
 		      (make-random-descriptor
-		       (lookup-foreign-symbol
-		        (vm::extern-alien-name "closure_tramp")
-			#+(or sparc ppc) :data)))))
+		       (lookup-special-symbol "closure_tramp"
+					      #+(or sparc ppc) :data)))))
     fdefn))
 
 (defun initialize-static-fns ()
@@ -2582,7 +2597,9 @@
 			  (header-name *genesis-c-header-name*))
   "Builds a kernel Lisp image from the .FASL files specified in the given
   File-List and writes it to a file named by Core-Name."
-  (unless (or #+linkage-table t symbol-table)
+  (unless (or #+(and linkage-table (not (or sparc ppc))) t symbol-table)
+    ;; We need the symbol table for sparc and ppc, even with
+    ;; linkage-tables.
     (error "Can't genesis without a symbol-table."))
   (format t "~&Building ~S for the ~A~%"
 	  core-name (c:backend-version c:*backend*))
@@ -2594,12 +2611,17 @@
 	(progn
 	  (clrhash *fdefn-objects*)
 	  (clrhash *cold-symbols*)
-	  #-linkage-table (init-foreign-symbol-table)
+	  #+(and linkage-table (or sparc ppc))
+	  (init-foreign-symbol-table)
 	  #+linkage-table (init-foreign-linkage)
 	  (let ((version #-linkage-table (load-foreign-symbol-table
 					  symbol-table)
 			 #+linkage-table (symbol-table-version
 					  symbol-table)))
+	    ;; Need to do this so we can find undefined_tramp and
+	    ;; closure_tramp with the NEW lisp.
+	    #+(and linkage-table (or sparc ppc))
+	    (load-foreign-symbol-table symbol-table)
 	    (initialize-spaces)
 	    (initialize-symbols)
 	    (initialize-layouts)