diff --git a/src/dynamic_load.c b/src/dynamic_load.c
index 763e53d2e50acf71bf5daeed6fe318c0973c5c62..b94bf6e27c73e513ee43c96a03762e6e5cfa157a 100644
--- a/src/dynamic_load.c
+++ b/src/dynamic_load.c
@@ -7,9 +7,16 @@
 #  include "stralloc.h"
 #  include "pike_macros.h"
 
-RCSID("$Id: dynamic_load.c,v 1.28 1998/05/15 19:01:05 grubba Exp $");
+RCSID("$Id: dynamic_load.c,v 1.29 1998/07/09 12:45:35 grubba Exp $");
 
-#endif
+#endif /* !TESTING */
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif /* HAVE_ERRNO_H */
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif /* HAVE_STRING_H */
 
 #if !defined(HAVE_DLOPEN)
 
@@ -18,6 +25,11 @@ RCSID("$Id: dynamic_load.c,v 1.28 1998/05/15 19:01:05 grubba Exp $");
 #define HAVE_SOME_DLOPEN
 #define EMULATE_DLOPEN
 #else
+#if defined(HAVE_SHL_LOAD) && defined(HAVE_DL_H)
+#define USE_HPUX_DL
+#define HAVE_SOME_DLOPEN
+#define EMULATE_DLOPEN
+#else
 #if defined(HAVE_LOADLIBRARY) && defined(HAVE_FREELIBRARY) && \
     defined(HAVE_GETPROCADDRESS) && defined(HAVE_WINBASE_H)
 #define USE_LOADLIBRARY
@@ -25,6 +37,7 @@ RCSID("$Id: dynamic_load.c,v 1.28 1998/05/15 19:01:05 grubba Exp $");
 #define EMULATE_DLOPEN
 #endif
 #endif
+#endif
 #else
 #define HAVE_SOME_DLOPEN
 #endif
@@ -76,11 +89,12 @@ static void dlclose(void *module)
 
 #define dlinit()
 
-#endif
+#endif /* USE_LOADLIBRARY */
+
 
 #ifdef USE_DLD
 #include <dld.h>
-static void *dlopen(char *foo, int how)
+static void *dlopen(char *module_name, int how)
 {
   dld_create_reference("pike_module_init");
   if(dld_link(module_name))
@@ -118,8 +132,60 @@ static void dlinit(void)
   }
 }
 
+#endif /* USE_DLD */
+
+
+#ifdef USE_HPUX_DL
+
+#include <dl.h>
+
+#if defined(TESTING) && defined(BIND_VERBOSE)
+#define RTLD_NOW	BIND_IMMEDIATE | BIND_VERBOSE
+#else
+#define RTLD_NOW	BIND_IMMEDIATE
+#endif /* TESTING && BIND_VERBOSE */
+
+extern int errno;
+
+static void *dlopen(char *libname, int how)
+{
+  shl_t lib;
+
+  lib = shl_load(libname, how, 0L);
+
+  return (void *)lib;
+}
 
+static char *dlerror(void)
+{
+#ifdef HAVE_STRERROR
+  return strerror(errno);
+#else
+  return ""; /* I hope it's better than null..*/
 #endif
+}
+
+static void *dlsym(void *module, char *function)
+{
+  void *func;
+  int result;
+  shl_t mod = (shl_t)module;
+
+  result = shl_findsym(&mod, function, TYPE_UNDEFINED, &func);
+  if (result == -1)
+    return NULL;
+  return func;
+}
+
+static void dlclose(void *module)
+{
+  shl_unload((shl_t)module);
+}
+
+#define dlinit()
+
+#endif /* USE_HPUX_DL */
+
 
 #ifndef EMULATE_DLOPEN
 
@@ -128,18 +194,19 @@ static void dlinit(void)
 #endif
 
 #define dlinit()
-#endif
+#endif  /* !EMULATE_DLOPEN */
+
 
 #ifndef RTLD_NOW
 #define RTLD_NOW 0
 #endif
 
+#endif
 
-#endif /* !EMULATE_DLOPEN */
 
 #ifndef TESTING
 
-#if defined(HAVE_DLOPEN) || defined(USE_DLD)
+#if defined(HAVE_DLOPEN) || defined(USE_DLD) || defined(USE_HPUX_DL)
 
 struct module_list
 {
@@ -210,12 +277,12 @@ void f_load_module(INT32 args)
   push_program(end_program());
 }
 
+#endif /* HAVE_DLOPEN || USE_DLD || USE_HPUX_DL */
 
-#endif /* HAVE_DLOPEN || USE_DLD */
 
 void init_dynamic_load(void)
 {
-#if defined(HAVE_DLOPEN) || defined(USE_DLD)
+#if defined(HAVE_DLOPEN) || defined(USE_DLD) || defined(USE_HPUX_DL)
   dlinit();
 
   add_efun("load_module",f_load_module,"function(string:program)",OPT_EXTERNAL_DEPEND);
@@ -224,7 +291,7 @@ void init_dynamic_load(void)
 
 void exit_dynamic_load(void)
 {
-#if defined(HAVE_DLOPEN) || defined(USE_DLD)
+#if defined(HAVE_DLOPEN) || defined(USE_DLD) || defined(USE_HPUX_DL)
   while(dynamic_module_list)
   {
     struct module_list *tmp=dynamic_module_list;