The first chunk requires a change to the logic of finding extensions:
Makefile.SHs thinks that thread/shared is going to be autobuilt (special case
it!).

The second chunk may be put to Makefile.SHs as is.

--- ./GNUmakefile-pre	Thu Sep 25 13:55:40 2003
+++ ./GNUmakefile	Tue Oct  7 02:02:26 2003
@@ -56,7 +56,7 @@ STATIC = static_pic
 # the dynamic loader path you are building a shared libperl.
 LDLIBPTH = LD_LIBRARY_PATH=K:/get/perl/perl581_21379
 
-dynamic_ext =   lib/auto/B/B.dll lib/auto/ByteLoader/ByteLoader.dll lib/auto/Cwd/Cwd.dll lib/auto/DB_File/DB_File.dll lib/auto/Data/Dumper/Dumper.dll lib/auto/Devel/DProf/DProf.dll lib/auto/Devel/PPPort/PPPort.dll lib/auto/Devel/Peek/Peek.dll lib/auto/Digest/MD5/MD5.dll lib/auto/Encode/Encode.dll lib/auto/Fcntl/Fcntl.dll lib/auto/File/Glob/Glob.dll lib/auto/Filter/Util/Call/Call.dll lib/auto/IO/IO.dll lib/auto/List/Util/Util.dll lib/auto/MIME/Base64/Base64.dll lib/auto/OS2/ExtAttr/ExtAttr.dll lib/auto/OS2/PrfDB/PrfDB.dll lib/auto/OS2/Process/Process.dll lib/auto/OS2/REXX/REXX.dll lib/auto/Opcode/Opcode.dll lib/auto/POSIX/POSIX.dll lib/auto/PerlIO/encoding/encoding.dll lib/auto/PerlIO/scalar/scalar.dll lib/auto/PerlIO/via/via.dll lib/auto/SDBM_File/SDBM_File.dll lib/auto/Socket/Socket.dll lib/auto/Storable/Storable.dll lib/auto/Sys/Hostname/Hostname.dll lib/auto/Sys/Syslog/Syslog.dll lib/auto/Time/HiRes/HiRes.dll lib/auto/Unicode/Normalize/Normalize.dll lib/auto/XS/APItest/APItest.dll lib/auto/XS/Typemap/Typemap.dll lib/auto/attrs/attrs.dll lib/auto/re/re.dll lib/auto/threads/threads.dll lib/auto/threads/shared/shared.dll
+dynamic_ext =   lib/auto/B/B.dll lib/auto/ByteLoader/ByteLoader.dll lib/auto/Cwd/Cwd.dll lib/auto/DB_File/DB_File.dll lib/auto/Data/Dumper/Dumper.dll lib/auto/Devel/DProf/DProf.dll lib/auto/Devel/PPPort/PPPort.dll lib/auto/Devel/Peek/Peek.dll lib/auto/Digest/MD5/MD5.dll lib/auto/Encode/Encode.dll lib/auto/Fcntl/Fcntl.dll lib/auto/File/Glob/Glob.dll lib/auto/Filter/Util/Call/Call.dll lib/auto/IO/IO.dll lib/auto/List/Util/Util.dll lib/auto/MIME/Base64/Base64.dll lib/auto/OS2/ExtAttr/ExtAttr.dll lib/auto/OS2/PrfDB/PrfDB.dll lib/auto/OS2/Process/Process.dll lib/auto/OS2/REXX/REXX.dll lib/auto/Opcode/Opcode.dll lib/auto/POSIX/POSIX.dll lib/auto/PerlIO/encoding/encoding.dll lib/auto/PerlIO/scalar/scalar.dll lib/auto/PerlIO/via/via.dll lib/auto/SDBM_File/SDBM_File.dll lib/auto/Socket/Socket.dll lib/auto/Storable/Storable.dll lib/auto/Sys/Hostname/Hostname.dll lib/auto/Sys/Syslog/Syslog.dll lib/auto/Time/HiRes/HiRes.dll lib/auto/Unicode/Normalize/Normalize.dll lib/auto/XS/APItest/APItest.dll lib/auto/XS/Typemap/Typemap.dll lib/auto/attrs/attrs.dll lib/auto/re/re.dll lib/auto/threads/threads.dll
 static_ext =  
 nonxs_ext =   ext/Errno/pm_to_blib
 ext = $(dynamic_ext) $(static_ext) $(nonxs_ext)
@@ -396,9 +396,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
 
@@ -410,8 +415,8 @@ 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) -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
