--- ./makedef.pl-pre	Tue Sep  9 08:48:18 2003
+++ ./makedef.pl	Tue Oct  7 12:02:30 2003
@@ -1340,7 +1340,10 @@ foreach my $symbol (sort keys %export) {
 }
 
 if ($PLATFORM eq 'os2') {
-	print "; LAST_ORDINAL=$sym_ord\n";
+	print <<EOP;
+    dll_perlmain=main
+; LAST_ORDINAL=$sym_ord
+EOP
 }
 
 sub emit_symbol {
--- ./os2/Makefile.SHs-pre	Mon Mar 31 22:23:12 2003
+++ ./os2/Makefile.SHs	Sat Oct 11 15:35:12 2003
@@ -43,7 +43,7 @@ AOUT_CLDFLAGS_DLL	= -Zexe -Zmt -Zcrtdll 
 SO_CCCMD	= \$(CC) $ccflags \$(OPTIMIZE)
 
 LD_OPT		= \$(OPTIMIZE)
-PERL_DLL_LD_OPT = -Zmap -Zlinker /map
+PERL_DLL_LD_OPT = -Zmap -Zlinker /map/li
 
 PERL_DLL_BASE	= perl$dll_post
 PERL_DLL	= \$(PERL_DLL_BASE)\$(DLSUFFIX)
@@ -55,7 +55,7 @@ AOUT_EXTRA_LIBS	= $aout_extra_libs
 
 $spitshell >>Makefile <<'!NO!SUBS!'
 PREPLIBRARY_LIBPERL = $(LIBPERL)
-$(LIBPERL): perl.imp $(PERL_DLL) perl5.def libperl_override.lib
+$(LIBPERL): perl.imp perl5.def libperl_override.lib
 	emximp -o $(LIBPERL) perl.imp
 	cp $(LIBPERL) perl.lib
 
@@ -68,6 +68,16 @@ libperl_override.imp: os2/os2add.sym min
 libperl_override.lib: libperl_override.imp
 	emximp -o $@ libperl_override.imp
 
+libperl_dllmain.imp:
+	echo	'main	$(PERL_DLL_BASE)	dll_perlmain	?' >> tmpdll.imp
+	sh mv-if-diff tmpdll.imp $@
+
+libperl_dllmain.lib: libperl_dllmain.imp
+	emximp -o $@ libperl_dllmain.imp
+
+libperl_dllmain.a: libperl_dllmain.imp
+	emximp -o $@ libperl_dllmain.imp
+
 $(AOUT_LIBPERL_DLL): perl.imp $(PERL_DLL) perl5.def
 	emximp -o $(AOUT_LIBPERL_DLL) perl.imp
 
@@ -82,7 +92,8 @@ perl.imp: perl5.def
 	perlrexx test_prep_perl_ test_prep_perl_sys test_prep_perl_stat \
 	test_prep_perl_stat_aout test_prep_various \
 	stat_aout_harness aout_harness stat_harness sys_harness all_harness \
-	stat_aout_test aout_test stat_test sys_test all_test
+	stat_aout_test aout_test stat_test sys_test all_test \
+	perl___harness test_harness_redir
 
 perl_dll: $(PERL_DLL)
 
@@ -91,8 +102,8 @@ perl_dll_t: t/$(PERL_DLL)
 t/$(PERL_DLL): $(PERL_DLL)
 	$(LNS) $(PERL_DLL) t/$(PERL_DLL)
 
-$(PERL_DLL): $(obj) perl5.def perl$(OBJ_EXT)
-	$(LD) $(LD_OPT) $(LDDLFLAGS) $(PERL_DLL_LD_OPT) -o $@ perl$(OBJ_EXT) $(obj) $(libs) perl5.def || ( rm $(PERL_DLL) && sh -c false )
+$(PERL_DLL): $(obj) perl5.def perl$(OBJ_EXT) perlmain$(OBJ_EXT) $(DYNALOADER)
+	$(LD) $(LD_OPT) $(LDDLFLAGS) $(PERL_DLL_LD_OPT) -o $@ perl$(OBJ_EXT) $(obj) perlmain$(OBJ_EXT) $(DYNALOADER) $(libs) perl5.def || ( rm $(PERL_DLL) && sh -c false )
 
 perl5.olddef: perl.linkexp
 	echo "LIBRARY '$(PERL_DLL_BASE)' INITINSTANCE TERMINSTANCE"	> $@
@@ -155,9 +166,16 @@ dlfcn.h: os2/dlfcn.h
 	cp -f $< $@
 
 # Non-Forking dynamically loaded perl
+# Make many: they are useful in low-memory conditions (floppy boot?  Lot of shared memory used?)
 
-perl___$(EXE_EXT) perl___: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl___ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /map/PM:VIO
+perl___$(EXE_EXT) perl___: $& libperl_dllmain$(LIB_EXT)
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl___ libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -Zstack 8192 -o perl___8 libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -Zstack 4096 -o perl___4 libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -Zstack 2048 -o perl___2 libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -Zstack 1024 -o perl___1 libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -Zstack 512 -o perl___05 libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -Zstack 320 -o perl___03 libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
 
 # This one is compiled -Zsys, so cannot do many things:
 
@@ -166,16 +184,16 @@ STAT_CLDFLAGS = -Zexe -Zomf -Zmt -Zstack
 
 # Non-forking dynamically loaded perl with a wrong CRT library:
 
-perl_stat: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(SHRPENV) $(CC) $(STAT_CLDFLAGS) $(CCDLFLAGS) -o $@ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /map/PM:VIO
+perl_stat perl_stat$(EXE_EXT): $& libperl_dllmain$(LIB_EXT)
+	$(SHRPENV) $(CC) $(STAT_CLDFLAGS) $(CCDLFLAGS) -o perl_stat libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
 
 # Remove -Zcrtdll, add -Zsys
 SYS_CLDFLAGS = $(STAT_CLDFLAGS) -Zsys
 
 # Non-Forking dynamically loaded perl without EMX - so with wrong CRT library
 
-perl_sys: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(SHRPENV) $(CC) $(SYS_CLDFLAGS) $(CCDLFLAGS) -o $@ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /map/PM:VIO
+perl_sys perl_sys$(EXE_EXT): $& libperl_dllmain$(LIB_EXT)
+	$(SHRPENV) $(CC) $(SYS_CLDFLAGS) $(CCDLFLAGS) -o perl_sys libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
 
 installcmd : 
 	@perl -e 'die qq{Give the option INSTALLCMDDIR=... to make!} if $$ARGV[0] eq ""' $(INSTALLCMDDIR)
@@ -203,7 +221,7 @@ $(DYNALOADER_OBJ) : $(DYNALOADER)
 $(AOUT_LIBPERL) : $(aout_obj) perl$(AOUT_OBJ_EXT)
 	rm -f $@
 	$(AOUT_AR) rcu $@ perl$(AOUT_OBJ_EXT) $(aout_obj)
-	cp $@ perl.a
+	cp $@ perl$(AOUT_LIB_EXT)
 
 .c$(AOUT_OBJ_EXT):
 	$(AOUT_CCCMD) $(PLDLFLAGS) -c $*.c
@@ -214,9 +232,14 @@ opmini$(AOUT_OBJ_EXT): op.c
 perlmain(AOUT_OBJ_EXT): perlmain.c
 	$(AOUT_CCCMD_DLL) $(PLDLFLAGS) -c perlmain.c
 
-aout_perlmain.c: miniperlmain.c config.sh makefile $(static_ext_autoinit)
-	sh writemain $(DYNALOADER) $(aout_static_lib) > tmp
-	sh mv-if-diff tmp aout_perlmain.c
+# Assume that extensions are at most 4 deep (this is so with 5.8.1)
+aout_extlist: $(aout_static_ext)
+	echo lib/auto/*.a lib/auto/*/*.a lib/auto/*/*/*.a lib/auto/*/*/*/*.a | tr ' ' '\n' | grep -v '\*' > $@.tmp
+	sh mv-if-diff $@.tmp $@
+
+aout_perlmain.c: miniperlmain.c config.sh makefile $(static_ext_autoinit) $(aout_static_ext) writemain aout_extlist
+	sh writemain `cat aout_extlist` > aout_perlmain.tmp
+	sh mv-if-diff aout_perlmain.tmp aout_perlmain.c
 
 _preplibrary = miniperl lib/Config.pm lib/lib.pm lib/re.pm
 
@@ -228,35 +251,35 @@ miniperl_: $& miniperlmain$(AOUT_OBJ_EXT
 # Need a miniperl_ dependency, since $(AOUT_DYNALOADER) is build via implicit
 # rules, thus would not rebuild miniperl_ via an explicit rule
 
-perl_$(EXE_EXT) perl_: $& miniperl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs
-	$(CC) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER) $(aout_static_ext) $(AOUT_LIBPERL) `cat ext.libs` $(libs)
+perl_$(EXE_EXT) perl_: $& miniperl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs aout_extlist
+	$(CC) $(AOUT_CLDFLAGS) $(CCDLFLAGS) $(OPTIMIZE) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) `cat aout_extlist` $(AOUT_LIBPERL) `cat ext.libs` $(libs)
 
 # Remove -Zcrtdll
 STAT_AOUT_CLDFLAGS = -Zexe -Zmt -Zstack 32000
 
 # Forking dynamically loaded perl with a wrong CRT library:
 
-perl_stat_aout$(EXE_EXT) perl_stat_aout: $& perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) ext.libs
-	$(SHRPENV) $(CC) $(STAT_AOUT_CLDFLAGS) $(CCDLFLAGS) -o $@ perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) `cat ext.libs` $(libs)
+perl_stat_aout$(EXE_EXT) perl_stat_aout: $& libperl_dllmain$(AOUT_LIB_EXT)
+	$(SHRPENV) $(CC) $(STAT_AOUT_CLDFLAGS) $(CCDLFLAGS) $(OPTIMIZE) -o perl_stat_aout libperl_dllmain$(AOUT_LIB_EXT)
 
 PERLREXX_DLL = perlrexx.dll
 
-perl : perl__ perl___ $(PERLREXX_DLL)
+perl perl$(EXE_EXT) : perl__ perl___ $(PERLREXX_DLL) $(PERL_DLL)
 
 # Dynamically loaded PM-application perl:
 
-perl__$(EXE_EXT) perl__: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl__ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /PM:PM
+perl__$(EXE_EXT) perl__: $& libperl_dllmain$(LIB_EXT)
+	$(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl__ libperl_dllmain$(LIB_EXT) -Zlinker /PM:PM
 
 # Forking dynamically loaded perl:
 
-perl$(EXE_EXT) perl: $& perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) ext.libs
-	$(CC) $(AOUT_CLDFLAGS_DLL) $(CCDLFLAGS) -o perl perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) `cat ext.libs` $(libs)
+perl$(EXE_EXT) perl: $& libperl_dllmain$(AOUT_LIB_EXT)
+	$(CC) $(AOUT_CLDFLAGS_DLL) $(CCDLFLAGS) -o perl libperl_dllmain$(AOUT_LIB_EXT)
 
 clean: aout_clean
 
 aout_clean:
-	-rm *perl_.* *.o *.a lib/auto/*/*.a ext/*/Makefile.aout
+	-rm *perl_.* *.o *.a lib/auto/*/*.a lib/auto/*/*/*.a lib/auto/*/*/*/*.a ext/*/Makefile.aout ext/*/*/Makefile.aout  ext/*/*/*/Makefile.aout
 
 aout_install: perl_ aout_install.perl
 
@@ -351,7 +374,10 @@ perl___harness: test_prep_perl___
 
 all_test: test aout_test perl___test sys_test stat_test stat_aout_test
 
-all_harness: test_harness aout_harness perl___harness sys_harness stat_harness stat_aout_harness
+test_harness_redir: test_prep
+	-PERL=./perl $(MAKE) TESTFILE=harness _test $(REDIR_TEST)
+
+all_harness: test_harness_redir aout_harness perl___harness sys_harness stat_harness stat_aout_harness
 
 !NO!SUBS!
 
@@ -385,7 +411,7 @@ do
 		else
 		    # Need to treat subsubdirectories manually
 		    dd_treated=''
-		    for ddd in $dd/*
+		    for ddd in $dd/*		# ext/*/*/*/Makefile.PL
 		    do
 			if test ! -d $ddd; then
 			    continue
@@ -403,6 +429,12 @@ do
 	   done
 	fi
 done
+
+# ext/threads is marked as NORECURS, so we need to specialcase it
+if echo "$static_ext $dynamic_ext" | grep -q threads/shared ; then
+   preci="$preci ext/threads/%/Makefile.aout"
+   dirs="$dirs ext/threads"
+fi
 
 $spitshell >>Makefile <<!GROK!THIS!
 .PRECIOUS : $preci
