diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index 3f69c0561a33..2cd51428a8f5 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: kern_linker.c,v 1.21 1999/01/19 22:26:46 peter Exp $
+ *	$Id: kern_linker.c,v 1.22 1999/01/23 03:45:22 peter Exp $
  */
 
 #include "opt_ddb.h"
@@ -355,6 +355,7 @@ linker_make_file(const char* pathname, void* priv, struct linker_file_ops* ops)
 
     lf->refs = 1;
     lf->userrefs = 0;
+    lf->flags = 0;
     lf->filename = (char*) (lf + 1);
     strcpy(lf->filename, filename);
     lf->id = next_file_id++;
@@ -410,7 +411,9 @@ linker_file_unload(linker_file_t file)
 	goto out;
     }
 
-    linker_file_sysuninit(file);
+    /* Don't try to run SYSUNINITs if we are unloaded due to a link error */
+    if (file->flags & LINKER_FILE_LINKED)
+	linker_file_sysuninit(file);
 
     TAILQ_REMOVE(&files, file, link);
     lockmgr(&lock, LK_RELEASE, 0, curproc);
diff --git a/sys/kern/link_aout.c b/sys/kern/link_aout.c
index 29b588489b68..27ba4bd922ee 100644
--- a/sys/kern/link_aout.c
+++ b/sys/kern/link_aout.c
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: link_aout.c,v 1.16 1998/11/03 14:25:21 peter Exp $
+ *	$Id: link_aout.c,v 1.17 1998/11/04 15:20:57 peter Exp $
  */
 
 #ifndef __alpha__
@@ -115,6 +115,7 @@ link_aout_init(void* arg)
 	linker_kernel_file->address = (caddr_t) 0xf0100000;
 	linker_kernel_file->size = -0xf0100000;
 	linker_current_file = linker_kernel_file;
+	linker_kernel_file->flags |= LINKER_FILE_LINKED;
     }
 #endif
 }
@@ -171,6 +172,7 @@ link_aout_load_module(const char* filename, linker_file_t* result)
 	linker_file_unload(lf);
 	return(error);
     }
+    lf->flags |= LINKER_FILE_LINKED;
     *result = lf;
     return(0);
 }
@@ -253,6 +255,7 @@ link_aout_load_file(const char* filename, linker_file_t* result)
 	goto out;
     }
 
+    lf->flags |= LINKER_FILE_LINKED;
     *result = lf;
 
 out:
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index c5e84daf0a3e..3d8671302617 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: link_elf.c,v 1.10 1998/11/06 15:16:07 peter Exp $
+ *	$Id: link_elf.c,v 1.11 1998/12/31 09:17:20 peter Exp $
  */
 
 #include <sys/param.h>
@@ -175,6 +175,7 @@ link_elf_init(void* arg)
 	}
 	(void)parse_module_symbols(linker_kernel_file);
 	linker_current_file = linker_kernel_file;
+	linker_kernel_file->flags |= LINKER_FILE_LINKED;
     }
 #endif
 }
@@ -384,6 +385,7 @@ link_elf_load_module(const char *filename, linker_file_t *result)
 	return error;
     }
     (void)parse_module_symbols(lf);
+    lf->flags |= LINKER_FILE_LINKED;
     *result = lf;
     return (0);
 }
@@ -673,6 +675,8 @@ link_elf_load_file(const char* filename, linker_file_t* result)
     ef->ddbstrcnt = strcnt;
     ef->ddbstrtab = ef->strbase;
 
+    lf->flags |= LINKER_FILE_LINKED;
+
 nosyms:
 
     *result = lf;
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index c5e84daf0a3e..3d8671302617 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: link_elf.c,v 1.10 1998/11/06 15:16:07 peter Exp $
+ *	$Id: link_elf.c,v 1.11 1998/12/31 09:17:20 peter Exp $
  */
 
 #include <sys/param.h>
@@ -175,6 +175,7 @@ link_elf_init(void* arg)
 	}
 	(void)parse_module_symbols(linker_kernel_file);
 	linker_current_file = linker_kernel_file;
+	linker_kernel_file->flags |= LINKER_FILE_LINKED;
     }
 #endif
 }
@@ -384,6 +385,7 @@ link_elf_load_module(const char *filename, linker_file_t *result)
 	return error;
     }
     (void)parse_module_symbols(lf);
+    lf->flags |= LINKER_FILE_LINKED;
     *result = lf;
     return (0);
 }
@@ -673,6 +675,8 @@ link_elf_load_file(const char* filename, linker_file_t* result)
     ef->ddbstrcnt = strcnt;
     ef->ddbstrtab = ef->strbase;
 
+    lf->flags |= LINKER_FILE_LINKED;
+
 nosyms:
 
     *result = lf;
diff --git a/sys/sys/linker.h b/sys/sys/linker.h
index 52536ee98e2e..2462a05b7787 100644
--- a/sys/sys/linker.h
+++ b/sys/sys/linker.h
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: linker.h,v 1.10 1998/11/04 15:20:58 peter Exp $
+ *	$Id: linker.h,v 1.11 1998/11/11 13:04:40 peter Exp $
  */
 
 #ifndef _SYS_LINKER_H_
@@ -86,6 +86,8 @@ struct common_symbol {
 struct linker_file {
     int			refs;		/* reference count */
     int			userrefs;	/* kldload(2) count */
+    int			flags;
+#define LINKER_FILE_LINKED	0x1	/* file has been fully linked */
     TAILQ_ENTRY(linker_file) link;	/* list of all loaded files */
     char*		filename;	/* file which was loaded */
     int			id;		/* unique id */