diff -r 496feb41b83f src/Makefile
--- a/src/Makefile	Tue Jul 20 13:11:28 2010 +0200
+++ b/src/Makefile	Tue Jul 20 14:31:54 2010 -0400
@@ -404,7 +404,7 @@
 # If both python2.x and python3.x are enabled then the linking will be via
 # dlopen(), dlsym(), dlclose(), i.e. pythonX.Y.so must be available
 #CONF_OPT_PYTHON = --enable-pythoninterp
-CONF_OPT_PYTHON3 = --enable-python3interp
+#CONF_OPT_PYTHON3 = --enable-python3interp
 
 # RUBY
 # Uncomment this when you want to include the Ruby interface.
@@ -1311,7 +1311,7 @@
 .SUFFIXES: .c .o .pro
 
 PRE_DEFS = -Iproto $(DEFS) $(GUI_DEFS) $(GUI_IPATH) $(CPPFLAGS) $(EXTRA_IPATHS)
-POST_DEFS = $(X_CFLAGS) $(LUA_CFLAGS) $(MZSCHEME_CFLAGS) $(PERL_CFLAGS) $(ECL_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS)
+POST_DEFS = $(X_CFLAGS) $(LUA_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS)
 
 ALL_CFLAGS = $(PRE_DEFS) $(CFLAGS) $(PROFILE_CFLAGS) $(POST_DEFS)
 
@@ -2494,10 +2494,10 @@
 	$(MZSCHEME_MZC) --c-mods mzscheme_base.c ++lib scheme/base
 
 objects/if_perl.o: auto/if_perl.c
-	$(CCC) -o $@ auto/if_perl.c
+	$(CCC) $(PERL_CFLAGS) -o $@ auto/if_perl.c
 
 objects/if_perlsfio.o: if_perlsfio.c
-	$(CCC) -o $@ if_perlsfio.c
+	$(CCC) $(PERL_CFLAGS) -o $@ if_perlsfio.c
 
 objects/py_config.o: $(PYTHON_CONFDIR)/config.c
 	$(CCC) $(PYTHON_CFLAGS) -o $@ $(PYTHON_CONFDIR)/config.c \
diff -r 496feb41b83f src/config.h.in
--- a/src/config.h.in	Tue Jul 20 13:11:28 2010 +0200
+++ b/src/config.h.in	Tue Jul 20 14:31:54 2010 -0400
@@ -325,6 +325,9 @@
 /* Define if you want to include the Perl interpreter. */
 #undef FEAT_PERL
 
+/* Define for linking via dlopen() or LoadLibrary() */
+#undef DYNAMIC_PERL
+
 /* Define if you want to include the Python interpreter. */
 #undef FEAT_PYTHON
 
diff -r 496feb41b83f src/configure.in
--- a/src/configure.in	Tue Jul 20 13:11:28 2010 +0200
+++ b/src/configure.in	Tue Jul 20 14:31:54 2010 -0400
@@ -213,7 +213,7 @@
     */*) ;;
     no)
       # avoid adding local dir to LDFLAGS and CPPFLAGS
-      have_local_dir=yes
+      have_local_include=yes
       have_local_lib=yes
       ;;
     *) AC_MSG_ERROR(must pass path argument to --with-local-dir) ;;
@@ -620,16 +620,17 @@
 
 AC_MSG_CHECKING(--enable-perlinterp argument)
 AC_ARG_ENABLE(perlinterp,
-	[  --enable-perlinterp     Include Perl interpreter.], ,
+	[  --enable-perlinterp[=OPTS]     Include Perl interpreter.  [default=no] [OPTS=no/yes/dynamic]], ,
 	[enable_perlinterp="no"])
 AC_MSG_RESULT($enable_perlinterp)
-if test "$enable_perlinterp" = "yes"; then
+if test "$enable_perlinterp" = "yes" -o "$enable_perlinterp" = "dynamic"; then
   AC_SUBST(vi_cv_path_perl)
   AC_PATH_PROG(vi_cv_path_perl, perl)
   if test "X$vi_cv_path_perl" != "X"; then
     AC_MSG_CHECKING(Perl version)
     if $vi_cv_path_perl -e 'require 5.003_01' >/dev/null 2>/dev/null; then
      eval `$vi_cv_path_perl -V:usethreads`
+     eval `$vi_cv_path_perl -V:libperl`
      if test "X$usethreads" = "XUNKNOWN" -o "X$usethreads" = "Xundef"; then
        badthreads=no
      else
@@ -722,6 +723,12 @@
       PERL_LIBS="-L$darwindir/CORE -lperl"
     fi
   fi
+  if test "$enable_perlinterp" = "dynamic"; then
+    if test "$perl_ok" = "yes" -a "X$libperl" != "X"; then
+      AC_DEFINE(DYNAMIC_PERL)
+      PERL_CFLAGS="-DDYNAMIC_PERL_DLL=\\\"$libperl\\\" $PERL_CFLAGS"
+    fi
+  fi
 fi
 AC_SUBST(shrpenv)
 AC_SUBST(PERL_SRC)
diff -r 496feb41b83f src/if_perl.xs
--- a/src/if_perl.xs	Tue Jul 20 13:11:28 2010 +0200
+++ b/src/if_perl.xs	Tue Jul 20 14:31:54 2010 -0400
@@ -84,9 +84,32 @@
 EXTERN_C void boot_DynaLoader __ARGS((pTHX_ CV*));
 
 /*
- * For dynamic linked perl. (Windows)
+ * For dynamic linked perl.
  */
 #if defined(DYNAMIC_PERL) || defined(PROTO)
+
+#ifndef DYNAMIC_PERL /* just generating prototypes */
+#ifdef _MSWIN
+typedef int HANDLE;
+#endif
+typedef int XSINIT_t;
+typedef int XSUBADDR_t;
+typedef int perl_key;
+#endif
+
+#ifndef _MSWIN
+#include <dlfcn.h>
+#define HANDLE void*
+#define PERL_PROC void*
+#define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
+#define symbol_from_dll dlsym
+#define close_dll dlclose
+#else
+#define PERL_PROC FARPROC
+#define load_dll LoadLibrary
+#define symbol_from_dll GetProcAddress
+#define close_dll FreeLibrary
+#endif
 /*
  * Wrapper defines
  */
@@ -173,6 +196,7 @@
 # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr
 # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr
 # define boot_DynaLoader dll_boot_DynaLoader
+# define Perl_Gthr_key_ptr dll_Perl_Gthr_key_ptr
 
 # define Perl_sys_init dll_Perl_sys_init
 # define Perl_sys_term dll_Perl_sys_term
@@ -191,12 +215,6 @@
 # define Perl_Iscopestack_ix_ptr dll_Perl_Iscopestack_ix_ptr
 # define Perl_Iunitcheckav_ptr dll_Perl_Iunitcheckav_ptr
 
-#ifndef DYNAMIC_PERL /* just generating prototypes */
-typedef int HANDLE;
-typedef int XSINIT_t;
-typedef int XSUBADDR_t;
-#endif
-
 /*
  * Declare HANDLE for perl.dll and function pointers.
  */
@@ -280,6 +298,7 @@
 static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*);
 static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*);
 static void (*boot_DynaLoader)_((pTHX_ CV*));
+static perl_key* (*Perl_Gthr_key_ptr)_((pTHX));
 
 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
 static void (*Perl_sv_free2)(pTHX_ SV*);
@@ -304,7 +323,6 @@
 /*
  * Table of name to function pointer of perl.
  */
-#define PERL_PROC FARPROC
 static struct {
     char* name;
     PERL_PROC* ptr;
@@ -408,6 +426,7 @@
     {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr},
     {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr},
     {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader},
+    {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr},
     {"", NULL},
 };
 
@@ -428,7 +447,7 @@
 
     if (hPerlLib != NULL)
 	return OK;
-    if (!(hPerlLib = LoadLibraryEx(libname, NULL, 0)))
+    if ((hPerlLib = load_dll(libname)) == NULL)
     {
 	if (verbose)
 	    EMSG2(_("E370: Could not load library %s"), libname);
@@ -436,10 +455,10 @@
     }
     for (i = 0; perl_funcname_table[i].ptr; ++i)
     {
-	if (!(*perl_funcname_table[i].ptr = GetProcAddress(hPerlLib,
+	if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib,
 			perl_funcname_table[i].name)))
 	{
-	    FreeLibrary(hPerlLib);
+	    close_dll(hPerlLib);
 	    hPerlLib = NULL;
 	    if (verbose)
 		EMSG2(_(e_loadfunc), perl_funcname_table[i].name);
@@ -508,7 +527,7 @@
 #ifdef DYNAMIC_PERL
     if (hPerlLib)
     {
-	FreeLibrary(hPerlLib);
+	close_dll(hPerlLib);
 	hPerlLib = NULL;
     }
 #endif
diff -r 496feb41b83f src/link.sh
--- a/src/link.sh	Tue Jul 20 13:11:28 2010 +0200
+++ b/src/link.sh	Tue Jul 20 14:31:54 2010 -0400
@@ -41,7 +41,7 @@
   if sh link.cmd; then
     touch auto/link.sed
     cp link.cmd linkit.sh
-    for libname in SM ICE nsl dnet dnet_stub inet socket dir elf iconv Xt Xmu Xp Xpm X11 Xdmcp x w dl pthread thread readline m perl crypt attr; do
+    for libname in SM ICE nsl dnet dnet_stub inet socket dir elf iconv Xt Xmu Xp Xpm X11 Xdmcp x w perl dl pthread thread readline m crypt attr; do
       cont=yes
       while test -n "$cont"; do
         if grep "l$libname " linkit.sh >/dev/null; then
