diff --git a/code/interr.lisp b/code/interr.lisp
index bdab49b76467763c3eef08669ea4a8d514d9ddf8..653bc5dfc8d4932ab2fb07d3ad68f1b19a1fcff2 100644
--- a/code/interr.lisp
+++ b/code/interr.lisp
@@ -5,7 +5,7 @@
 ;;; Carnegie Mellon University, and has been placed in the public domain.
 ;;;
 (ext:file-comment
-  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/interr.lisp,v 1.38 2001/10/27 17:41:49 pmai Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/interr.lisp,v 1.39 2002/08/28 13:29:26 pmai Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -469,6 +469,12 @@
 	 :datum object
 	 :expected-type 'instance))
 
+#+linkage-table
+(deferr undefined-foreign-symbol-error (symbol)
+  (error 'simple-program-error
+         :function-name name
+	 :format-control "Undefined foreign symbol: ~S"
+	 :format-arguments (list symbol)))
 
 
 ;;; INFINITE-ERROR-PROTECT is used by ERROR and friends to keep us out of
diff --git a/compiler/generic/interr.lisp b/compiler/generic/interr.lisp
index 7b0b4fe3cd0dc08bc8abef83b2d76b64a156179a..fde0c57b245cc7d6a3f600d81d116c1b31c0b1a8 100644
--- a/compiler/generic/interr.lisp
+++ b/compiler/generic/interr.lisp
@@ -5,7 +5,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/interr.lisp,v 1.11 2002/08/27 22:18:27 moore Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/generic/interr.lisp,v 1.12 2002/08/28 13:29:27 pmai Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -185,5 +185,6 @@
    "Function with declared result type NIL returned.")
   (layout-invalid
    "Layout is invalid (instance obsolete.)")
+  #+linkage-table
   (undefined-foreign-symbol
    "No value for foreign symbol."))
diff --git a/lisp/Linux-os.c b/lisp/Linux-os.c
index 6295ee0b885e9116d3157b711f1dc5bea3735c14..9de09be7927d345a58cf8731f38d4532ee0e23f8 100644
--- a/lisp/Linux-os.c
+++ b/lisp/Linux-os.c
@@ -15,7 +15,7 @@
  * GENCGC support by Douglas Crosher, 1996, 1997.
  * Alpha support by Julian Dolby, 1999.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.14 2002/08/28 07:16:38 moore Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.15 2002/08/28 13:29:25 pmai Exp $
  *
  */
 
@@ -294,9 +294,12 @@ static void *dlsym_fallback(void *handle, const char *name)
 
     strcpy(newsym, "PVE_stub_");
     strcat(newsym, name);
-    if ((sym_addr = dlsym(handle, newsym)) == 0) {
+    sym_addr = dlsym(handle, newsym);
+#ifdef DEBUG
+    if (sym_addr == 0) {
 	fputs(dlerror(), stderr);
     }
+#endif
     return sym_addr;
 }
 
diff --git a/lisp/os-common.c b/lisp/os-common.c
index d3e4fc04bd029531d8d4e131a9f1a17bb9b9c562..26815657d5152a6aa141c82f3c52ce4a9aa1cebb 100644
--- a/lisp/os-common.c
+++ b/lisp/os-common.c
@@ -1,6 +1,6 @@
 /*
 
- $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/os-common.c,v 1.5 2002/08/27 22:18:33 moore Exp $
+ $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/os-common.c,v 1.6 2002/08/28 13:29:25 pmai Exp $
 
  This code was written as part of the CMU Common Lisp project at
  Carnegie Mellon University, and has been placed in the public domain.
@@ -103,11 +103,13 @@ os_vm_address_t os_reallocate(os_vm_address_t addr, os_vm_size_t old_len,
     }
 }
 
+#ifdef LINKAGE_TABLE
 extern void resolve_linkage_tramp(void);
 
 /* In words */
-
 #define LINKAGE_DATA_ENTRY_SIZE 3
+#endif
+
 void os_foreign_linkage_init (void)
 {
 #ifdef LINKAGE_TABLE
@@ -187,8 +189,9 @@ os_resolve_data_linkage(void)
 
 /* Make entry for the symbol at entry in LINKAGE_TABLE_DATA.  Called
    from register-foreign-linkage. */
-
-extern void undefined_ff_tramp(lispobj arg);
+#ifdef LINKAGE_TABLE
+extern void undefined_foreign_symbol_trap(lispobj arg);
+#endif
 
 unsigned long os_link_one_symbol(long entry)
 {
@@ -213,7 +216,7 @@ unsigned long os_link_one_symbol(long entry)
     target_addr = os_dlsym((char *)symbol_name->data,
 			   data_vector->data[table_index + 2]);
     if (!target_addr) {
-	undefined_ff_tramp((lispobj)data_vector->data[table_index]);
+	undefined_foreign_symbol_trap((lispobj)data_vector->data[table_index]);
     }
     arch_make_linkage_entry(entry, target_addr, type);
     return target_addr;
diff --git a/lisp/x86-arch.c b/lisp/x86-arch.c
index c99252fab5bbea27d33cbb6262b8247bda73efb4..786e2135866e04986ff9d50a1458978a39b42650 100644
--- a/lisp/x86-arch.c
+++ b/lisp/x86-arch.c
@@ -1,6 +1,6 @@
 /* x86-arch.c -*- Mode: C; comment-column: 40 -*-
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.17 2002/08/27 22:18:33 moore Exp $ 
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.18 2002/08/28 13:29:25 pmai Exp $ 
  *
  */
 
@@ -343,10 +343,11 @@ lispobj  funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2)
     return call_into_lisp(function, args, 3);
 }
 
+#ifdef LINKAGE_TABLE
+
 /* Linkage entry size is 8, for no good reason. */
 #define LINKAGE_ENTRY_SIZE 8
 
-#ifdef LINKAGE_TABLE
 void arch_make_linkage_entry(long linkage_entry, void *target_addr, long type)
 {
     char *reloc_addr = (char *)(FOREIGN_LINKAGE_SPACE_START
diff --git a/lisp/x86-assem.S b/lisp/x86-assem.S
index 44175c60898a19fa46a19379ba826c41df8be4a1..b307bc1426c91a271f6f105be6b1cf69ccac39c5 100644
--- a/lisp/x86-assem.S
+++ b/lisp/x86-assem.S
@@ -1,6 +1,6 @@
 ### x86-assem.S -*- Mode: Asm; -*-
 /**
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-assem.S,v 1.22 2002/08/27 22:18:34 moore Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-assem.S,v 1.23 2002/08/28 13:29:25 pmai Exp $
  *
  * Authors:	Paul F. Werkowski <pw@snoopy.mv.com>
  *		Douglas T. Crosher
@@ -850,6 +850,8 @@ GNAME(alloc_overflow_edi):
 
 #endif
 
+#ifdef LINKAGE_TABLE
+
 /* Call into C code to resolve a linkage entry.  The initial code in the 
  * linkage entry has done a call to here; pass that return entry along as a 
  * parameter.
@@ -890,13 +892,13 @@ GNAME(resolve_linkage_tramp):
 	.size	 GNAME(resolve_linkage_tramp),.-GNAME(resolve_linkage_tramp)
 
 /*
- * The undefined-ff-function trampoline.
+ * The C-callable undefined-foreign-symbol trapping function.
  */
 	.text
 	.align	align_4byte,0x90
-	.global GNAME(undefined_ff_tramp)
-	.type	GNAME(undefined_ff_tramp),@function
-GNAME(undefined_ff_tramp):
+	.global GNAME(undefined_foreign_symbol_trap)
+	.type	GNAME(undefined_foreign_symbol_trap),@function
+GNAME(undefined_foreign_symbol_trap):
 	/* C Calling Convention, move one arg to EAX */
         pushl %ebp
         movl %esp,%ebp
@@ -904,27 +906,18 @@ GNAME(undefined_ff_tramp):
 
 	/* Now trap to Lisp */
 	int3
-	/* The trap code: */
 	.byte	trap_Error
-	/* The number of arguments, including the error code */
+        /* Number of argument bytes */
         .byte   2
-	/* The error code, which varies with long-float availability */
-	/* Here we use undefined-foreign-symbol-error. */
-#ifdef type_LongFloat
-        .byte   67
-#else
-        .byte   66
-#endif
-	/* Now the real args.  Each arg is provided via a SC-OFFSET.
-	   SC-OFFSETS are defined in code/debug-info.lisp.  They
-	   encode the storage class and storage class offset in
-	   one 27bit integer, the storage class taking the 5 LSBs,
-	   with the 22 MSBs indicating the offset.  */
-        .byte   sc_DescriptorReg | 0x00 # EAX in the Descriptor-reg SC.
+	.byte	UNDEFINED_FOREIGN_SYMBOL_ERROR
+        /* SC_OFFSET(sc_DescriptorReg,reg_EAX) */
+        .byte   SC_OFFSET(sc_DescriptorReg,0)
 
 	/* C Calling Convention */
 	/* Doesn't matter here, but could if we'd use trap_Cerror */
 	leave
 	ret
-	.size	GNAME(undefined_ff_tramp), .-GNAME(undefined_ff_tramp)
+	.size	GNAME(undefined_foreign_symbol_trap), .-GNAME(undefined_foreign_symbol_trap)
 	.end
+
+#endif /* LINKAGE_TABLE */