Fix module loading for vkernel.
authorSimon Schubert <corecode@dragonflybsd.org>
Thu, 7 Jun 2007 22:58:11 +0000 (22:58 +0000)
committerSimon Schubert <corecode@dragonflybsd.org>
Thu, 7 Jun 2007 22:58:11 +0000 (22:58 +0000)
Some symbols in the vkernel are actually provided by libs the
kernel binary is linked to, which can not be resolved by the
internal kernel linker.  Fall back on using dlsym() if no
symbol could be found by the kernel linker.  This actually means
that the kernel needs to be linked dynamically.

sys/kern/kern_linker.c

index 9a17d12..c1159f3 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_linker.c,v 1.41.2.3 2001/11/21 17:50:35 luigi Exp $
- * $DragonFly: src/sys/kern/kern_linker.c,v 1.37 2007/05/19 19:33:02 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_linker.c,v 1.38 2007/06/07 22:58:11 corecode Exp $
  */
 
 #include "opt_ddb.h"
 
 #include <vm/vm_zone.h>
 
+#ifdef _KERNEL_VIRTUAL
+#include <dlfcn.h>
+#endif
+
 #ifdef KLD_DEBUG
 int kld_debug = 0;
 #endif
@@ -622,6 +626,14 @@ linker_file_lookup_symbol(linker_file_t file, const char* name, int deps, caddr_
        return 0;
     }
 
+#ifdef _KERNEL_VIRTUAL
+    *raddr = dlsym(RTLD_NEXT, name);
+    if (*raddr != NULL) {
+       KLD_DPF(SYM, ("linker_file_lookup_symbol: found dlsym=%x\n", *raddr));
+       return 0;
+    }
+#endif
+
     KLD_DPF(SYM, ("linker_file_lookup_symbol: fail\n"));
     return ENOENT;
 }