This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Create perl5116delta and update other versions
[perl5.git] / makedef.pl
1 #./perl -w
2 #
3 # Create the export list for perl.
4 #
5 # Needed by WIN32 and OS/2 for creating perl.dll,
6 # and by AIX for creating libperl.a when -Dusershrplib is in effect,
7 # and by MacOS Classic.
8 #
9 # Reads from information stored in
10 #
11 #    config.h
12 #    config.sh
13 #    global.sym
14 #    globvar.sym
15 #    intrpvar.h
16 #    macperl.sym  (on MacOS)
17 #    miniperl.map (on OS/2)
18 #    perl5.def    (on OS/2; this is the old version of the file being made)
19 #    perlio.sym
20 #    perlvars.h
21 #
22 # plus long lists of function names hard-coded directly in this script and
23 # in the DATA section.
24 #
25 # Writes the result to STDOUT.
26 #
27 # Normally this script is invoked from a makefile (e.g. win32/Makefile),
28 # which redirects STDOUT to a suitable file, such as:
29 #
30 #    perl5.def   OS/2
31 #    perldll.def Windows
32 #    perl.exp    AIX
33 #    perl.imp    NetWare
34
35
36 BEGIN { unshift @INC, "lib" }
37 use Config;
38 use strict;
39
40 use vars qw($PLATFORM $CCTYPE $FILETYPE $CONFIG_ARGS $ARCHNAME $PATCHLEVEL);
41
42 my (%define, %ordinal);
43
44 while (@ARGV) {
45     my $flag = shift;
46     if ($flag =~ s/^CC_FLAGS=/ /) {
47         for my $fflag ($flag =~ /(?:^|\s)-D(\S+)/g) {
48             $fflag     .= '=1' unless $fflag =~ /^(\w+)=/;
49             $define{$1} = $2   if $fflag =~ /^(\w+)=(.+)$/;
50         }
51         next;
52     }
53     $define{$1} = 1 if ($flag =~ /^-D(\w+)$/);
54     $define{$1} = $2 if ($flag =~ /^-D(\w+)=(.+)$/);
55     $CCTYPE   = $1 if ($flag =~ /^CCTYPE=(\w+)$/);
56     $PLATFORM = $1 if ($flag =~ /^PLATFORM=(\w+)$/);
57     if ($PLATFORM eq 'netware') {
58         $FILETYPE = $1 if ($flag =~ /^FILETYPE=(\w+)$/);
59     }
60 }
61
62 my @PLATFORM = qw(aix win32 wince os2 MacOS netware);
63 my %PLATFORM;
64 @PLATFORM{@PLATFORM} = ();
65
66 defined $PLATFORM || die "PLATFORM undefined, must be one of: @PLATFORM\n";
67 exists $PLATFORM{$PLATFORM} || die "PLATFORM must be one of: @PLATFORM\n";
68
69 if ($PLATFORM eq 'win32' or $PLATFORM eq 'wince' or $PLATFORM eq "aix") {
70         # Add the compile-time options that miniperl was built with to %define.
71         # On Win32 these are not the same options as perl itself will be built
72         # with since miniperl is built with a canned config (one of the win32/
73         # config_H.*) and none of the BUILDOPT's that are set in the makefiles,
74         # but they do include some #define's that are hard-coded in various
75         # source files and header files and don't include any BUILDOPT's that
76         # the user might have chosen to disable because the canned configs are
77         # minimal configs that don't include any of those options.
78         my $opts = ($PLATFORM eq 'wince' ? '-MCross' : ''); # for wince need Cross.pm to get Config.pm
79
80         $ENV{PERL5LIB} = join $Config{path_sep}, @INC;
81         my $cmd = "$^X $opts -V";
82         my $config = `$cmd`
83             or die "Couldn't run [$cmd]: $!";
84         my($options) = $config =~ /^  Compile-time options: (.*?)\n^  \S/ms;
85         $options =~ s/\s+/ /g;
86         print STDERR "Options: ($options)\n";
87         foreach (split /\s+/, $options) {
88                 $define{$_} = 1;
89         }
90 }
91
92 my %exportperlmalloc =
93     (
94        Perl_malloc              =>      "malloc",
95        Perl_mfree               =>      "free",
96        Perl_realloc             =>      "realloc",
97        Perl_calloc              =>      "calloc",
98     );
99
100 my $exportperlmalloc = $PLATFORM eq 'os2';
101
102 my $config_sh   = "config.sh";
103 my $config_h    = "config.h";
104 my $intrpvar_h  = "intrpvar.h";
105 my $perlvars_h  = "perlvars.h";
106 my $global_sym  = "global.sym";
107 my $pp_sym      = "pp.sym";
108 my $globvar_sym = "globvar.sym";
109 my $perlio_sym  = "perlio.sym";
110 my $static_ext = "";
111
112 if ($PLATFORM eq 'aix') {
113     # Nothing for now.
114 }
115 elsif ($PLATFORM =~ /^win(?:32|ce)$/ || $PLATFORM eq 'netware') {
116     $CCTYPE = "MSVC" unless defined $CCTYPE;
117     foreach ($intrpvar_h, $perlvars_h, $global_sym,
118              $pp_sym, $globvar_sym, $perlio_sym) {
119         s!^!..\\!;
120     }
121 }
122 elsif ($PLATFORM eq 'MacOS') {
123     foreach ($intrpvar_h, $perlvars_h, $global_sym,
124              $pp_sym, $globvar_sym, $perlio_sym) {
125         s!^!::!;
126     }
127 }
128
129 unless ($PLATFORM eq 'win32' || $PLATFORM eq 'wince' || $PLATFORM eq 'MacOS' || $PLATFORM eq 'netware') {
130     open(CFG,$config_sh) || die "Cannot open $config_sh: $!\n";
131     while (<CFG>) {
132         if (/^(?:ccflags|optimize)='(.+)'$/) {
133             $_ = $1;
134             $define{$1} = 1 while /-D(\w+)/g;
135         }
136         if (/^(d_(?:mmap|sigaction))='(.+)'$/) {
137             $define{$1} = $2;
138         }
139         if ($PLATFORM eq 'os2') {
140             $CONFIG_ARGS = $1 if /^config_args='(.+)'$/;
141             $ARCHNAME =    $1 if /^archname='(.+)'$/;
142             $PATCHLEVEL =  $1 if /^perl_patchlevel='(.+)'$/;
143         }
144     }
145     close(CFG);
146 }
147 if ($PLATFORM eq 'win32' || $PLATFORM eq 'wince') {
148     open(CFG,"<..\\$config_sh") || die "Cannot open ..\\$config_sh: $!\n";
149     if ((join '', <CFG>) =~ /^static_ext='(.*)'$/m) {
150         $static_ext = $1;
151     }
152     close(CFG);
153 }
154
155 open(CFG,$config_h) || die "Cannot open $config_h: $!\n";
156 while (<CFG>) {
157     $define{$1} = 1 if /^\s*#\s*define\s+(MYMALLOC)\b/;
158     $define{$1} = 1 if /^\s*#\s*define\s+(MULTIPLICITY)\b/;
159     $define{$1} = 1 if /^\s*#\s*define\s+(PERL_\w+)\b/;
160     $define{$1} = 1 if /^\s*#\s*define\s+(USE_\w+)\b/;
161     $define{$1} = 1 if /^\s*#\s*define\s+(HAS_\w+)\b/;
162 }
163 close(CFG);
164
165 # perl.h logic duplication begins
166
167 if ($define{PERL_IMPLICIT_SYS}) {
168     $define{PL_OP_SLAB_ALLOC} = 1;
169 }
170
171 if ($define{USE_ITHREADS}) {
172     if (!$define{MULTIPLICITY}) {
173         $define{MULTIPLICITY} = 1;
174     }
175 }
176
177 $define{PERL_IMPLICIT_CONTEXT} ||=
178     $define{USE_ITHREADS} ||
179     $define{MULTIPLICITY} ;
180
181 if ($define{USE_ITHREADS} && $PLATFORM ne 'win32' && $^O ne 'darwin') {
182     $define{USE_REENTRANT_API} = 1;
183 }
184
185 # perl.h logic duplication ends
186
187 my $sym_ord = 0;
188
189 print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n";
190
191 if ($PLATFORM =~ /^win(?:32|ce)$/) {
192     (my $dll = ($define{PERL_DLL} || "perl511")) =~ s/\.dll$//i;
193     print "LIBRARY $dll\n";
194     # The DESCRIPTION module definition file statement is not supported
195     # by VC7 onwards.
196     if ($CCTYPE !~ /^MSVC7/ && $CCTYPE !~ /^MSVC8/ && $CCTYPE !~ /^MSVC9/) {
197         print "DESCRIPTION 'Perl interpreter'\n";
198     }
199     print "EXPORTS\n";
200     if ($define{PERL_IMPLICIT_SYS}) {
201         output_symbol("perl_get_host_info");
202         output_symbol("perl_alloc_override");
203     }
204     if ($define{USE_ITHREADS} and $define{PERL_IMPLICIT_SYS}) {
205         output_symbol("perl_clone_host");
206     }
207 }
208 elsif ($PLATFORM eq 'os2') {
209     if (open my $fh, '<', 'perl5.def') {
210       while (<$fh>) {
211         last if /^\s*EXPORTS\b/;
212       }
213       while (<$fh>) {
214         $ordinal{$1} = $2 if /^\s*"(\w+)"\s*(?:=\s*"\w+"\s*)?\@(\d+)\s*$/;
215         # This allows skipping ordinals which were used in older versions
216         $sym_ord = $1 if /^\s*;\s*LAST_ORDINAL\s*=\s*(\d+)\s*$/;
217       }
218       $sym_ord < $_ and $sym_ord = $_ for values %ordinal; # Take the max
219     }
220     (my $v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/;
221     $v .= '-thread' if $ARCHNAME =~ /-thread/;
222     (my $dll = $define{PERL_DLL}) =~ s/\.dll$//i;
223     $v .= "\@$PATCHLEVEL" if $PATCHLEVEL;
224     my $d = "DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter, configured as $CONFIG_ARGS'";
225     $d = substr($d, 0, 249) . "...'" if length $d > 253;
226     print <<"---EOP---";
227 LIBRARY '$dll' INITINSTANCE TERMINSTANCE
228 $d
229 STACKSIZE 32768
230 CODE LOADONCALL
231 DATA LOADONCALL NONSHARED MULTIPLE
232 EXPORTS
233 ---EOP---
234 }
235 elsif ($PLATFORM eq 'aix') {
236     my $OSVER = `uname -v`;
237     chop $OSVER;
238     my $OSREL = `uname -r`;
239     chop $OSREL;
240     if ($OSVER > 4 || ($OSVER == 4 && $OSREL >= 3)) {
241         print "#! ..\n";
242     } else {
243         print "#!\n";
244     }
245 }
246 elsif ($PLATFORM eq 'netware') {
247         if ($FILETYPE eq 'def') {
248         print "LIBRARY perl511\n";
249         print "DESCRIPTION 'Perl interpreter for NetWare'\n";
250         print "EXPORTS\n";
251         }
252         if ($define{PERL_IMPLICIT_SYS}) {
253             output_symbol("perl_get_host_info");
254             output_symbol("perl_alloc_override");
255             output_symbol("perl_clone_host");
256         }
257 }
258
259 my %skip;
260 my %export;
261
262 sub skip_symbols {
263     my $list = shift;
264     foreach my $symbol (@$list) {
265         $skip{$symbol} = 1;
266     }
267 }
268
269 sub emit_symbols {
270     my $list = shift;
271     foreach my $symbol (@$list) {
272         my $skipsym = $symbol;
273         # XXX hack
274         if ($define{MULTIPLICITY}) {
275             $skipsym =~ s/^Perl_[GIT](\w+)_ptr$/PL_$1/;
276         }
277         emit_symbol($symbol) unless exists $skip{$skipsym};
278     }
279 }
280
281 if ($PLATFORM eq 'win32') {
282     skip_symbols [qw(
283                      PL_statusvalue_vms
284                      PL_archpat_auto
285                      PL_cryptseen
286                      PL_DBcv
287                      PL_generation
288                      PL_lastgotoprobe
289                      PL_linestart
290                      PL_modcount
291                      PL_pending_ident
292                      PL_sublex_info
293                      PL_timesbuf
294                      main
295                      Perl_ErrorNo
296                      Perl_GetVars
297                      Perl_do_exec3
298                      Perl_do_ipcctl
299                      Perl_do_ipcget
300                      Perl_do_msgrcv
301                      Perl_do_msgsnd
302                      Perl_do_semop
303                      Perl_do_shmio
304                      Perl_dump_fds
305                      Perl_init_thread_intern
306                      Perl_my_bzero
307                      Perl_my_bcopy
308                      Perl_my_htonl
309                      Perl_my_ntohl
310                      Perl_my_swap
311                      Perl_my_chsize
312                      Perl_same_dirent
313                      Perl_setenv_getix
314                      Perl_unlnk
315                      Perl_watch
316                      Perl_safexcalloc
317                      Perl_safexmalloc
318                      Perl_safexfree
319                      Perl_safexrealloc
320                      Perl_my_memcmp
321                      Perl_my_memset
322                      PL_cshlen
323                      PL_cshname
324                      PL_opsave
325                      Perl_do_exec
326                      Perl_getenv_len
327                      Perl_my_pclose
328                      Perl_my_popen
329                      Perl_my_sprintf
330                      )];
331 }
332 else {
333     skip_symbols [qw(
334                      Perl_do_spawn
335                      Perl_do_spawn_nowait
336                      Perl_do_aspawn
337                      )];
338 }
339 if ($PLATFORM eq 'wince') {
340     skip_symbols [qw(
341                      PL_statusvalue_vms
342                      PL_archpat_auto
343                      PL_cryptseen
344                      PL_DBcv
345                      PL_generation
346                      PL_lastgotoprobe
347                      PL_linestart
348                      PL_modcount
349                      PL_pending_ident
350                      PL_sublex_info
351                      PL_timesbuf
352                      PL_collation_ix
353                      PL_collation_name
354                      PL_collation_standard
355                      PL_collxfrm_base
356                      PL_collxfrm_mult
357                      PL_numeric_compat1
358                      PL_numeric_local
359                      PL_numeric_name
360                      PL_numeric_radix_sv
361                      PL_numeric_standard
362                      PL_vtbl_collxfrm
363                      Perl_sv_collxfrm
364                      setgid
365                      setuid
366                      win32_free_childdir
367                      win32_free_childenv
368                      win32_get_childdir
369                      win32_get_childenv
370                      win32_spawnvp
371                      main
372                      Perl_ErrorNo
373                      Perl_GetVars
374                      Perl_do_exec3
375                      Perl_do_ipcctl
376                      Perl_do_ipcget
377                      Perl_do_msgrcv
378                      Perl_do_msgsnd
379                      Perl_do_semop
380                      Perl_do_shmio
381                      Perl_dump_fds
382                      Perl_init_thread_intern
383                      Perl_my_bzero
384                      Perl_my_bcopy
385                      Perl_my_htonl
386                      Perl_my_ntohl
387                      Perl_my_swap
388                      Perl_my_chsize
389                      Perl_same_dirent
390                      Perl_setenv_getix
391                      Perl_unlnk
392                      Perl_watch
393                      Perl_safexcalloc
394                      Perl_safexmalloc
395                      Perl_safexfree
396                      Perl_safexrealloc
397                      Perl_my_memcmp
398                      Perl_my_memset
399                      PL_cshlen
400                      PL_cshname
401                      PL_opsave
402                      Perl_do_exec
403                      Perl_getenv_len
404                      Perl_my_pclose
405                      Perl_my_popen
406                      Perl_my_sprintf
407                      )];
408 }
409 elsif ($PLATFORM eq 'aix') {
410     skip_symbols([qw(
411                      Perl_dump_fds
412                      Perl_ErrorNo
413                      Perl_GetVars
414                      Perl_my_bcopy
415                      Perl_my_bzero
416                      Perl_my_chsize
417                      Perl_my_htonl
418                      Perl_my_memcmp
419                      Perl_my_memset
420                      Perl_my_ntohl
421                      Perl_my_swap
422                      Perl_safexcalloc
423                      Perl_safexfree
424                      Perl_safexmalloc
425                      Perl_safexrealloc
426                      Perl_same_dirent
427                      Perl_unlnk
428                      Perl_sys_intern_clear
429                      Perl_sys_intern_dup
430                      Perl_sys_intern_init
431                      Perl_my_sprintf
432                      PL_cryptseen
433                      PL_opsave
434                      PL_statusvalue_vms
435                      PL_sys_intern
436                      )]);
437     skip_symbols([qw(
438                      Perl_signbit
439                      )])
440         if $define{'HAS_SIGNBIT'};
441     emit_symbols([qw(
442                      boot_DynaLoader
443                      )]);
444 }
445 elsif ($PLATFORM eq 'os2') {
446     emit_symbols([qw(
447                     ctermid
448                     get_sysinfo
449                     Perl_OS2_init
450                     Perl_OS2_init3
451                     Perl_OS2_term
452                     OS2_Perl_data
453                     dlopen
454                     dlsym
455                     dlerror
456                     dlclose
457                     dup2
458                     dup
459                     my_tmpfile
460                     my_tmpnam
461                     my_flock
462                     my_rmdir
463                     my_mkdir
464                     my_getpwuid
465                     my_getpwnam
466                     my_getpwent
467                     my_setpwent
468                     my_endpwent
469                     fork_with_resources
470                     croak_with_os2error
471                     setgrent
472                     endgrent
473                     getgrent
474                     malloc_mutex
475                     threads_mutex
476                     nthreads
477                     nthreads_cond
478                     os2_cond_wait
479                     os2_stat
480                     os2_execname
481                     async_mssleep
482                     msCounter
483                     InfoTable
484                     pthread_join
485                     pthread_create
486                     pthread_detach
487                     XS_Cwd_change_drive
488                     XS_Cwd_current_drive
489                     XS_Cwd_extLibpath
490                     XS_Cwd_extLibpath_set
491                     XS_Cwd_sys_abspath
492                     XS_Cwd_sys_chdir
493                     XS_Cwd_sys_cwd
494                     XS_Cwd_sys_is_absolute
495                     XS_Cwd_sys_is_relative
496                     XS_Cwd_sys_is_rooted
497                     XS_DynaLoader_mod2fname
498                     XS_File__Copy_syscopy
499                     Perl_Register_MQ
500                     Perl_Deregister_MQ
501                     Perl_Serve_Messages
502                     Perl_Process_Messages
503                     init_PMWIN_entries
504                     PMWIN_entries
505                     Perl_hab_GET
506                     loadByOrdinal
507                     pExtFCN
508                     os2error
509                     ResetWinError
510                     CroakWinError
511                     PL_do_undump
512                     )]);
513     emit_symbols([qw(os2_cond_wait
514                      pthread_join
515                      pthread_create
516                      pthread_detach
517                     )])
518       if $define{'USE_5005THREADS'} or $define{'USE_ITHREADS'};
519 }
520 elsif ($PLATFORM eq 'MacOS') {
521     skip_symbols [qw(
522                     Perl_GetVars
523                     PL_cryptseen
524                     PL_cshlen
525                     PL_cshname
526                     PL_statusvalue_vms
527                     PL_sys_intern
528                     PL_opsave
529                     PL_timesbuf
530                     Perl_dump_fds
531                     Perl_my_bcopy
532                     Perl_my_bzero
533                     Perl_my_chsize
534                     Perl_my_htonl
535                     Perl_my_memcmp
536                     Perl_my_memset
537                     Perl_my_ntohl
538                     Perl_my_swap
539                     Perl_safexcalloc
540                     Perl_safexfree
541                     Perl_safexmalloc
542                     Perl_safexrealloc
543                     Perl_unlnk
544                     Perl_sys_intern_clear
545                     Perl_sys_intern_init
546                     )];
547 }
548 elsif ($PLATFORM eq 'netware') {
549         skip_symbols [qw(
550                         PL_statusvalue_vms
551                         PL_archpat_auto
552                         PL_cryptseen
553                         PL_DBcv
554                         PL_generation
555                         PL_lastgotoprobe
556                         PL_linestart
557                         PL_modcount
558                         PL_pending_ident
559                         PL_sublex_info
560                         PL_timesbuf
561                         main
562                         Perl_ErrorNo
563                         Perl_GetVars
564                         Perl_do_exec3
565                         Perl_do_ipcctl
566                         Perl_do_ipcget
567                         Perl_do_msgrcv
568                         Perl_do_msgsnd
569                         Perl_do_semop
570                         Perl_do_shmio
571                         Perl_dump_fds
572                         Perl_init_thread_intern
573                         Perl_my_bzero
574                         Perl_my_htonl
575                         Perl_my_ntohl
576                         Perl_my_swap
577                         Perl_my_chsize
578                         Perl_same_dirent
579                         Perl_setenv_getix
580                         Perl_unlnk
581                         Perl_watch
582                         Perl_safexcalloc
583                         Perl_safexmalloc
584                         Perl_safexfree
585                         Perl_safexrealloc
586                         Perl_my_memcmp
587                         Perl_my_memset
588                         PL_cshlen
589                         PL_cshname
590                         PL_opsave
591                         Perl_do_exec
592                         Perl_getenv_len
593                         Perl_my_pclose
594                         Perl_my_popen
595                         Perl_sys_intern_init
596                         Perl_sys_intern_dup
597                         Perl_sys_intern_clear
598                         Perl_my_bcopy
599                         Perl_PerlIO_write
600                         Perl_PerlIO_unread
601                         Perl_PerlIO_tell
602                         Perl_PerlIO_stdout
603                         Perl_PerlIO_stdin
604                         Perl_PerlIO_stderr
605                         Perl_PerlIO_setlinebuf
606                         Perl_PerlIO_set_ptrcnt
607                         Perl_PerlIO_set_cnt
608                         Perl_PerlIO_seek
609                         Perl_PerlIO_read
610                         Perl_PerlIO_get_ptr
611                         Perl_PerlIO_get_cnt
612                         Perl_PerlIO_get_bufsiz
613                         Perl_PerlIO_get_base
614                         Perl_PerlIO_flush
615                         Perl_PerlIO_fill
616                         Perl_PerlIO_fileno
617                         Perl_PerlIO_error
618                         Perl_PerlIO_eof
619                         Perl_PerlIO_close
620                         Perl_PerlIO_clearerr
621                         PerlIO_perlio
622                         )];
623 }
624
625 unless ($define{'DEBUGGING'}) {
626     skip_symbols [qw(
627                     Perl_deb_growlevel
628                     Perl_debop
629                     Perl_debprofdump
630                     Perl_debstack
631                     Perl_debstackptrs
632                     Perl_pad_sv
633                     Perl_hv_assert
634                     PL_block_type
635                     PL_watchaddr
636                     PL_watchok
637                     PL_watch_pvx
638                     )];
639 }
640
641 if ($define{'PERL_IMPLICIT_CONTEXT'}) {
642     skip_symbols [qw(
643                     PL_sig_sv
644                     )];
645 }
646
647 if ($define{'PERL_IMPLICIT_SYS'}) {
648     skip_symbols [qw(
649                     Perl_getenv_len
650                     Perl_my_popen
651                     Perl_my_pclose
652                     )];
653 }
654 else {
655     skip_symbols [qw(
656                     PL_Mem
657                     PL_MemShared
658                     PL_MemParse
659                     PL_Env
660                     PL_StdIO
661                     PL_LIO
662                     PL_Dir
663                     PL_Sock
664                     PL_Proc
665                     )];
666 }
667
668 unless ($define{'PERL_OLD_COPY_ON_WRITE'}) {
669     skip_symbols [qw(
670                     Perl_sv_setsv_cow
671                   )];
672 }
673
674 unless ($define{'USE_REENTRANT_API'}) {
675     skip_symbols [qw(
676                     PL_reentrant_buffer
677                     )];
678 }
679
680 if ($define{'MYMALLOC'}) {
681     emit_symbols [qw(
682                     Perl_dump_mstats
683                     Perl_get_mstats
684                     Perl_strdup
685                     Perl_putenv
686                     MallocCfg_ptr
687                     MallocCfgP_ptr
688                     )];
689     if ($define{'USE_ITHREADS'}) {
690         emit_symbols [qw(
691                         PL_malloc_mutex
692                         )];
693     }
694     else {
695         skip_symbols [qw(
696                         PL_malloc_mutex
697                         )];
698     }
699 }
700 else {
701     skip_symbols [qw(
702                     PL_malloc_mutex
703                     Perl_dump_mstats
704                     Perl_get_mstats
705                     Perl_malloced_size
706                     Perl_malloc_good_size
707                     MallocCfg_ptr
708                     MallocCfgP_ptr
709                     )];
710 }
711
712 if ($define{'PERL_USE_SAFE_PUTENV'}) {
713     skip_symbols [qw(
714                    PL_use_safe_putenv
715                   )];
716 }
717
718 unless ($define{'USE_ITHREADS'}) {
719     skip_symbols [qw(
720                     PL_thr_key
721                     )];
722 }
723
724 # USE_5005THREADS symbols. Kept as reference for easier removal
725     skip_symbols [qw(
726                     PL_sv_mutex
727                     PL_strtab_mutex
728                     PL_svref_mutex
729                     PL_cred_mutex
730                     PL_eval_mutex
731                     PL_fdpid_mutex
732                     PL_sv_lock_mutex
733                     PL_eval_cond
734                     PL_eval_owner
735                     PL_threads_mutex
736                     PL_nthreads
737                     PL_nthreads_cond
738                     PL_threadnum
739                     PL_threadsv_names
740                     PL_thrsv
741                     PL_vtbl_mutex
742                     Perl_condpair_magic
743                     Perl_new_struct_thread
744                     Perl_per_thread_magicals
745                     Perl_thread_create
746                     Perl_find_threadsv
747                     Perl_unlock_condpair
748                     Perl_magic_mutexfree
749                     Perl_sv_lock
750                     )];
751
752 unless ($define{'USE_ITHREADS'}) {
753     skip_symbols [qw(
754                     PL_op_mutex
755                     PL_regex_pad
756                     PL_regex_padav
757                     PL_sharedsv_space
758                     PL_sharedsv_space_mutex
759                     PL_dollarzero_mutex
760                     PL_hints_mutex
761                     PL_my_ctx_mutex
762                     PL_perlio_mutex
763                     PL_regdupe
764                     Perl_parser_dup
765                     Perl_dirp_dup
766                     Perl_cx_dup
767                     Perl_si_dup
768                     Perl_any_dup
769                     Perl_ss_dup
770                     Perl_fp_dup
771                     Perl_gp_dup
772                     Perl_he_dup
773                     Perl_mg_dup
774                     Perl_mro_meta_dup
775                     Perl_re_dup_guts
776                     Perl_sv_dup
777                     Perl_rvpv_dup
778                     Perl_hek_dup
779                     Perl_sys_intern_dup
780                     perl_clone
781                     perl_clone_using
782                     Perl_sharedsv_find
783                     Perl_sharedsv_init
784                     Perl_sharedsv_lock
785                     Perl_sharedsv_new
786                     Perl_sharedsv_thrcnt_dec
787                     Perl_sharedsv_thrcnt_inc
788                     Perl_sharedsv_unlock
789                     Perl_stashpv_hvname_match
790                     Perl_regdupe_internal
791                     Perl_newPADOP
792                     )];
793 }
794
795 unless ($define{'PERL_IMPLICIT_CONTEXT'}) {
796     skip_symbols [qw(
797                     PL_my_cxt_index
798                     PL_my_cxt_list
799                     PL_my_cxt_size
800                     PL_my_cxt_keys
801                     Perl_croak_nocontext
802                     Perl_die_nocontext
803                     Perl_deb_nocontext
804                     Perl_form_nocontext
805                     Perl_load_module_nocontext
806                     Perl_mess_nocontext
807                     Perl_warn_nocontext
808                     Perl_warner_nocontext
809                     Perl_newSVpvf_nocontext
810                     Perl_sv_catpvf_nocontext
811                     Perl_sv_setpvf_nocontext
812                     Perl_sv_catpvf_mg_nocontext
813                     Perl_sv_setpvf_mg_nocontext
814                     Perl_my_cxt_init
815                     Perl_my_cxt_index
816                     )];
817 }
818
819 unless ($define{'PERL_IMPLICIT_SYS'}) {
820     skip_symbols [qw(
821                     perl_alloc_using
822                     perl_clone_using
823                     )];
824 }
825
826 unless ($define{'FAKE_THREADS'}) {
827     skip_symbols [qw(PL_curthr)];
828 }
829
830 unless ($define{'PL_OP_SLAB_ALLOC'}) {
831     skip_symbols [qw(
832                      PL_OpPtr
833                      PL_OpSlab
834                      PL_OpSpace
835                      Perl_Slab_Alloc
836                      Perl_Slab_Free
837                     )];
838 }
839
840 unless ($define{'PERL_DEBUG_READONLY_OPS'}) {
841     skip_symbols [qw(
842                     PL_slab_count
843                     PL_slabs
844                   )];
845 }
846
847 unless ($define{'THREADS_HAVE_PIDS'}) {
848     skip_symbols [qw(PL_ppid)];
849 }
850
851 unless ($define{'PERL_NEED_APPCTX'}) {
852     skip_symbols [qw(
853                     PL_appctx
854                     )];
855 }
856
857 unless ($define{'PERL_NEED_TIMESBASE'}) {
858     skip_symbols [qw(
859                     PL_timesbase
860                     )];
861 }
862
863 unless ($define{'DEBUG_LEAKING_SCALARS'}) {
864     skip_symbols [qw(
865                     PL_sv_serial
866                     )];
867 }
868
869 unless ($define{'DEBUG_LEAKING_SCALARS_FORK_DUMP'}) {
870     skip_symbols [qw(
871                     PL_dumper_fd
872                     )];
873 }
874 unless ($define{'PERL_DONT_CREATE_GVSV'}) {
875     skip_symbols [qw(
876                      Perl_gv_SVadd
877                     )];
878 }
879 if ($define{'SPRINTF_RETURNS_STRLEN'}) {
880     skip_symbols [qw(
881                      Perl_my_sprintf
882                     )];
883 }
884 unless ($define{'PERL_USES_PL_PIDSTATUS'}) {
885     skip_symbols [qw(
886                      Perl_pidgone
887                      PL_pidstatus
888                     )];
889 }
890
891 unless ($define{'PERL_TRACK_MEMPOOL'}) {
892     skip_symbols [qw(
893                      PL_memory_debug_header
894                     )];
895 }
896
897 if ($define{'PERL_MAD'}) {
898     skip_symbols [qw(
899                      PL_nextval
900                      PL_nexttype
901                      )];
902 } else {
903     skip_symbols [qw(
904                     PL_madskills
905                     PL_xmlfp
906                     PL_lasttoke
907                     PL_realtokenstart
908                     PL_faketokens
909                     PL_thismad
910                     PL_thistoken
911                     PL_thisopen
912                     PL_thisstuff
913                     PL_thisclose
914                     PL_thiswhite
915                     PL_nextwhite
916                     PL_skipwhite
917                     PL_endwhite
918                     PL_curforce
919                     Perl_pad_peg
920                     Perl_xmldump_indent
921                     Perl_xmldump_vindent
922                     Perl_xmldump_all
923                     Perl_xmldump_packsubs
924                     Perl_xmldump_sub
925                     Perl_xmldump_form
926                     Perl_xmldump_eval
927                     Perl_sv_catxmlsv
928                     Perl_sv_catxmlpvn
929                     Perl_sv_xmlpeek
930                     Perl_do_pmop_xmldump
931                     Perl_pmop_xmldump
932                     Perl_do_op_xmldump
933                     Perl_op_xmldump
934                     )];
935 }
936
937 unless ($define{'MULTIPLICITY'}) {
938     skip_symbols [qw(
939                     PL_interp_size
940                     PL_interp_size_5_10_0
941                     )];
942 }
943
944 unless ($define{'PERL_GLOBAL_STRUCT'}) {
945     skip_symbols [qw(
946                     PL_global_struct_size
947                     )];
948 }
949
950 unless ($define{'PERL_GLOBAL_STRUCT_PRIVATE'}) {
951     skip_symbols [qw(
952                     PL_my_cxt_keys
953                     Perl_my_cxt_index
954                     )];
955 }
956
957 unless ($define{'d_mmap'}) {
958     skip_symbols [qw(
959                     PL_mmap_page_size
960                     )];
961 }
962
963 if ($define{'d_sigaction'}) {
964     skip_symbols [qw(
965                     PL_sig_trapped
966                     )];
967 }
968
969 if ($^O ne 'vms') {
970     # VMS does its own thing for these symbols.
971     skip_symbols [qw(PL_sig_handlers_initted
972                      PL_sig_ignoring
973                      PL_sig_defaulting)];
974 }  
975
976 sub readvar {
977     my $file = shift;
978     my $proc = shift || sub { "PL_$_[2]" };
979     open(VARS,$file) || die "Cannot open $file: $!\n";
980     my @syms;
981     while (<VARS>) {
982         # All symbols have a Perl_ prefix because that's what embed.h
983         # sticks in front of them.  The A?I?S?C? is strictly speaking
984         # wrong.
985         push(@syms, &$proc($1,$2,$3)) if (/\bPERLVAR(A?I?S?C?)\(([IGT])(\w+)/);
986     }
987     close(VARS);
988     return \@syms;
989 }
990
991 if ($define{'PERL_GLOBAL_STRUCT'}) {
992     my $global = readvar($perlvars_h);
993     skip_symbols $global;
994     emit_symbol('Perl_GetVars');
995     emit_symbols [qw(PL_Vars PL_VarsPtr)] unless $CCTYPE eq 'GCC';
996 } else {
997     skip_symbols [qw(Perl_init_global_struct Perl_free_global_struct)];
998 }
999
1000 # functions from *.sym files
1001
1002 my @syms = ($global_sym, $globvar_sym); # $pp_sym is not part of the API
1003
1004 # Symbols that are the public face of the PerlIO layers implementation
1005 # These are in _addition to_ the public face of the abstraction
1006 # and need to be exported to allow XS modules to implement layers
1007 my @layer_syms = qw(
1008                     PerlIOBase_binmode
1009                     PerlIOBase_clearerr
1010                     PerlIOBase_close
1011                     PerlIOBase_dup
1012                     PerlIOBase_eof
1013                     PerlIOBase_error
1014                     PerlIOBase_fileno
1015                     PerlIOBase_noop_fail
1016                     PerlIOBase_noop_ok
1017                     PerlIOBase_popped
1018                     PerlIOBase_pushed
1019                     PerlIOBase_read
1020                     PerlIOBase_setlinebuf
1021                     PerlIOBase_unread
1022                     PerlIOBuf_bufsiz
1023                     PerlIOBuf_close
1024                     PerlIOBuf_dup
1025                     PerlIOBuf_fill
1026                     PerlIOBuf_flush
1027                     PerlIOBuf_get_base
1028                     PerlIOBuf_get_cnt
1029                     PerlIOBuf_get_ptr
1030                     PerlIOBuf_open
1031                     PerlIOBuf_popped
1032                     PerlIOBuf_pushed
1033                     PerlIOBuf_read
1034                     PerlIOBuf_seek
1035                     PerlIOBuf_set_ptrcnt
1036                     PerlIOBuf_tell
1037                     PerlIOBuf_unread
1038                     PerlIOBuf_write
1039                     PerlIO_allocate
1040                     PerlIO_apply_layera
1041                     PerlIO_apply_layers
1042                     PerlIO_arg_fetch
1043                     PerlIO_debug
1044                     PerlIO_define_layer
1045                     PerlIO_find_layer
1046                     PerlIO_isutf8
1047                     PerlIO_layer_fetch
1048                     PerlIO_list_alloc
1049                     PerlIO_list_free
1050                     PerlIO_modestr
1051                     PerlIO_parse_layers
1052                     PerlIO_pending
1053                     PerlIO_perlio
1054                     PerlIO_pop
1055                     PerlIO_push
1056                     PerlIO_sv_dup
1057                     Perl_PerlIO_clearerr
1058                     Perl_PerlIO_close
1059                     Perl_PerlIO_context_layers
1060                     Perl_PerlIO_eof
1061                     Perl_PerlIO_error
1062                     Perl_PerlIO_fileno
1063                     Perl_PerlIO_fill
1064                     Perl_PerlIO_flush
1065                     Perl_PerlIO_get_base
1066                     Perl_PerlIO_get_bufsiz
1067                     Perl_PerlIO_get_cnt
1068                     Perl_PerlIO_get_ptr
1069                     Perl_PerlIO_read
1070                     Perl_PerlIO_seek
1071                     Perl_PerlIO_set_cnt
1072                     Perl_PerlIO_set_ptrcnt
1073                     Perl_PerlIO_setlinebuf
1074                     Perl_PerlIO_stderr
1075                     Perl_PerlIO_stdin
1076                     Perl_PerlIO_stdout
1077                     Perl_PerlIO_tell
1078                     Perl_PerlIO_unread
1079                     Perl_PerlIO_write
1080 );
1081 if ($PLATFORM eq 'netware') {
1082     push(@layer_syms,'PL_def_layerlist','PL_known_layers','PL_perlio');
1083 }
1084
1085 if ($define{'USE_PERLIO'}) {
1086     # Export the symols that make up the PerlIO abstraction, regardless
1087     # of its implementation - read from a file
1088     push @syms, $perlio_sym;
1089
1090     # This part is then dependent on how the abstraction is implemented
1091     if ($define{'USE_SFIO'}) {
1092         # Old legacy non-stdio "PerlIO"
1093         skip_symbols \@layer_syms;
1094         skip_symbols [qw(perlsio_binmode)];
1095         # SFIO defines most of the PerlIO routines as macros
1096         # So undo most of what $perlio_sym has just done - d'oh !
1097         # Perhaps it would be better to list the ones which do exist
1098         # And emit them
1099         skip_symbols [qw(
1100                          PerlIO_canset_cnt
1101                          PerlIO_clearerr
1102                          PerlIO_close
1103                          PerlIO_eof
1104                          PerlIO_error
1105                          PerlIO_exportFILE
1106                          PerlIO_fast_gets
1107                          PerlIO_fdopen
1108                          PerlIO_fileno
1109                          PerlIO_findFILE
1110                          PerlIO_flush
1111                          PerlIO_get_base
1112                          PerlIO_get_bufsiz
1113                          PerlIO_get_cnt
1114                          PerlIO_get_ptr
1115                          PerlIO_getc
1116                          PerlIO_getname
1117                          PerlIO_has_base
1118                          PerlIO_has_cntptr
1119                          PerlIO_importFILE
1120                          PerlIO_open
1121                          PerlIO_printf
1122                          PerlIO_putc
1123                          PerlIO_puts
1124                          PerlIO_read
1125                          PerlIO_releaseFILE
1126                          PerlIO_reopen
1127                          PerlIO_rewind
1128                          PerlIO_seek
1129                          PerlIO_set_cnt
1130                          PerlIO_set_ptrcnt
1131                          PerlIO_setlinebuf
1132                          PerlIO_sprintf
1133                          PerlIO_stderr
1134                          PerlIO_stdin
1135                          PerlIO_stdout
1136                          PerlIO_stdoutf
1137                          PerlIO_tell
1138                          PerlIO_ungetc
1139                          PerlIO_vprintf
1140                          PerlIO_write
1141                          PerlIO_perlio
1142                          Perl_PerlIO_clearerr
1143                          Perl_PerlIO_close
1144                          Perl_PerlIO_eof
1145                          Perl_PerlIO_error
1146                          Perl_PerlIO_fileno
1147                          Perl_PerlIO_fill
1148                          Perl_PerlIO_flush
1149                          Perl_PerlIO_get_base
1150                          Perl_PerlIO_get_bufsiz
1151                          Perl_PerlIO_get_cnt
1152                          Perl_PerlIO_get_ptr
1153                          Perl_PerlIO_read
1154                          Perl_PerlIO_seek
1155                          Perl_PerlIO_set_cnt
1156                          Perl_PerlIO_set_ptrcnt
1157                          Perl_PerlIO_setlinebuf
1158                          Perl_PerlIO_stderr
1159                          Perl_PerlIO_stdin
1160                          Perl_PerlIO_stdout
1161                          Perl_PerlIO_tell
1162                          Perl_PerlIO_unread
1163                          Perl_PerlIO_write
1164                          PL_def_layerlist
1165                          PL_known_layers
1166                          PL_perlio
1167                          )];
1168     }
1169     else {
1170         # PerlIO with layers - export implementation
1171         emit_symbols \@layer_syms;
1172         emit_symbols [qw(perlsio_binmode)];
1173     }
1174     if ($define{'USE_ITHREADS'}) {
1175         emit_symbols [qw(
1176                         PL_perlio_mutex
1177                         )];
1178     }
1179     else {
1180         skip_symbols [qw(
1181                         PL_perlio_mutex
1182                         )];
1183     }
1184 } else {
1185         # -Uuseperlio
1186         # Skip the PerlIO layer symbols - although
1187         # nothing should have exported them anyway.
1188         skip_symbols \@layer_syms;
1189         skip_symbols [qw(
1190                         perlsio_binmode
1191                         PL_def_layerlist
1192                         PL_known_layers
1193                         PL_perlio
1194                         PL_perlio_debug_fd
1195                         PL_perlio_fd_refcnt
1196                         PL_perlio_fd_refcnt_size
1197                         )];
1198
1199         # Also do NOT add abstraction symbols from $perlio_sym
1200         # abstraction is done as #define to stdio
1201         # Remaining remnants that _may_ be functions
1202         # are handled in <DATA>
1203 }
1204
1205 for my $syms (@syms) {
1206     open (GLOBAL, "<$syms") || die "failed to open $syms: $!\n";
1207     while (<GLOBAL>) {
1208         next if (!/^[A-Za-z]/);
1209         # Functions have a Perl_ prefix
1210         # Variables have a PL_ prefix
1211         chomp($_);
1212         my $symbol = ($syms =~ /var\.sym$/i ? "PL_" : "");
1213         $symbol .= $_;
1214         emit_symbol($symbol) unless exists $skip{$symbol};
1215     }
1216     close(GLOBAL);
1217 }
1218
1219 # variables
1220
1221 if ($define{'MULTIPLICITY'}) {
1222     for my $f ($perlvars_h, $intrpvar_h) {
1223         my $glob = readvar($f, sub { "Perl_" . $_[1] . $_[2] . "_ptr" });
1224         emit_symbols $glob;
1225     }
1226     unless ($define{'USE_ITHREADS'}) {
1227         # XXX needed for XS extensions that define PERL_CORE
1228         emit_symbol("PL_curinterp");
1229     }
1230     # XXX AIX seems to want the perlvars.h symbols, for some reason
1231     if ($PLATFORM eq 'aix' or $PLATFORM eq 'os2') {     # OS/2 needs PL_thr_key
1232         my $glob = readvar($perlvars_h);
1233         emit_symbols $glob;
1234     }
1235 }
1236 else {
1237     unless ($define{'PERL_GLOBAL_STRUCT'}) {
1238         my $glob = readvar($perlvars_h);
1239         emit_symbols $glob;
1240     }
1241     unless ($define{'MULTIPLICITY'}) {
1242         my $glob = readvar($intrpvar_h);
1243         emit_symbols $glob;
1244     }
1245 }
1246
1247 sub try_symbol {
1248     my $symbol = shift;
1249
1250     return if $symbol !~ /^[A-Za-z_]/;
1251     return if $symbol =~ /^\#/;
1252     $symbol =~s/\r//g;
1253     chomp($symbol);
1254     return if exists $skip{$symbol};
1255     emit_symbol($symbol);
1256 }
1257
1258 while (<DATA>) {
1259     try_symbol($_);
1260 }
1261
1262 if ($PLATFORM =~ /^win(?:32|ce)$/) {
1263     foreach my $symbol (qw(
1264                             setuid
1265                             setgid
1266                             boot_DynaLoader
1267                             Perl_init_os_extras
1268                             Perl_thread_create
1269                             Perl_win32_init
1270                             Perl_win32_term
1271                             RunPerl
1272                             win32_async_check
1273                             win32_errno
1274                             win32_environ
1275                             win32_abort
1276                             win32_fstat
1277                             win32_stat
1278                             win32_pipe
1279                             win32_popen
1280                             win32_pclose
1281                             win32_rename
1282                             win32_setmode
1283                             win32_chsize
1284                             win32_lseek
1285                             win32_tell
1286                             win32_dup
1287                             win32_dup2
1288                             win32_open
1289                             win32_close
1290                             win32_eof
1291                             win32_isatty
1292                             win32_read
1293                             win32_write
1294                             win32_spawnvp
1295                             win32_mkdir
1296                             win32_rmdir
1297                             win32_chdir
1298                             win32_flock
1299                             win32_execv
1300                             win32_execvp
1301                             win32_htons
1302                             win32_ntohs
1303                             win32_htonl
1304                             win32_ntohl
1305                             win32_inet_addr
1306                             win32_inet_ntoa
1307                             win32_socket
1308                             win32_bind
1309                             win32_listen
1310                             win32_accept
1311                             win32_connect
1312                             win32_send
1313                             win32_sendto
1314                             win32_recv
1315                             win32_recvfrom
1316                             win32_shutdown
1317                             win32_closesocket
1318                             win32_ioctlsocket
1319                             win32_setsockopt
1320                             win32_getsockopt
1321                             win32_getpeername
1322                             win32_getsockname
1323                             win32_gethostname
1324                             win32_gethostbyname
1325                             win32_gethostbyaddr
1326                             win32_getprotobyname
1327                             win32_getprotobynumber
1328                             win32_getservbyname
1329                             win32_getservbyport
1330                             win32_select
1331                             win32_endhostent
1332                             win32_endnetent
1333                             win32_endprotoent
1334                             win32_endservent
1335                             win32_getnetent
1336                             win32_getnetbyname
1337                             win32_getnetbyaddr
1338                             win32_getprotoent
1339                             win32_getservent
1340                             win32_sethostent
1341                             win32_setnetent
1342                             win32_setprotoent
1343                             win32_setservent
1344                             win32_getenv
1345                             win32_putenv
1346                             win32_perror
1347                             win32_malloc
1348                             win32_calloc
1349                             win32_realloc
1350                             win32_free
1351                             win32_sleep
1352                             win32_times
1353                             win32_access
1354                             win32_alarm
1355                             win32_chmod
1356                             win32_open_osfhandle
1357                             win32_get_osfhandle
1358                             win32_ioctl
1359                             win32_link
1360                             win32_unlink
1361                             win32_utime
1362                             win32_gettimeofday
1363                             win32_uname
1364                             win32_wait
1365                             win32_waitpid
1366                             win32_kill
1367                             win32_str_os_error
1368                             win32_opendir
1369                             win32_readdir
1370                             win32_telldir
1371                             win32_seekdir
1372                             win32_rewinddir
1373                             win32_closedir
1374                             win32_longpath
1375                             win32_ansipath
1376                             win32_os_id
1377                             win32_getpid
1378                             win32_crypt
1379                             win32_dynaload
1380                             win32_get_childenv
1381                             win32_free_childenv
1382                             win32_clearenv
1383                             win32_get_childdir
1384                             win32_free_childdir
1385                             win32_stdin
1386                             win32_stdout
1387                             win32_stderr
1388                             win32_ferror
1389                             win32_feof
1390                             win32_strerror
1391                             win32_fprintf
1392                             win32_printf
1393                             win32_vfprintf
1394                             win32_vprintf
1395                             win32_fread
1396                             win32_fwrite
1397                             win32_fopen
1398                             win32_fdopen
1399                             win32_freopen
1400                             win32_fclose
1401                             win32_fputs
1402                             win32_fputc
1403                             win32_ungetc
1404                             win32_getc
1405                             win32_fileno
1406                             win32_clearerr
1407                             win32_fflush
1408                             win32_ftell
1409                             win32_fseek
1410                             win32_fgetpos
1411                             win32_fsetpos
1412                             win32_rewind
1413                             win32_tmpfile
1414                             win32_setbuf
1415                             win32_setvbuf
1416                             win32_flushall
1417                             win32_fcloseall
1418                             win32_fgets
1419                             win32_gets
1420                             win32_fgetc
1421                             win32_putc
1422                             win32_puts
1423                             win32_getchar
1424                             win32_putchar
1425                            ))
1426     {
1427         try_symbol($symbol);
1428     }
1429     if ($CCTYPE eq "BORLAND") {
1430         try_symbol('_matherr');
1431     }
1432 }
1433 elsif ($PLATFORM eq 'os2') {
1434     my (%mapped, @missing);
1435     open MAP, 'miniperl.map' or die 'Cannot read miniperl.map';
1436     /^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach <MAP>;
1437     close MAP or die 'Cannot close miniperl.map';
1438
1439     @missing = grep { !exists $mapped{$_} }
1440                     keys %export;
1441     @missing = grep { !exists $exportperlmalloc{$_} } @missing;
1442     delete $export{$_} foreach @missing;
1443 }
1444 elsif ($PLATFORM eq 'MacOS') {
1445     open MACSYMS, 'macperl.sym' or die 'Cannot read macperl.sym';
1446
1447     while (<MACSYMS>) {
1448         try_symbol($_);
1449     }
1450
1451     close MACSYMS;
1452 }
1453 elsif ($PLATFORM eq 'netware') {
1454 foreach my $symbol (qw(
1455                         boot_DynaLoader
1456                         Perl_init_os_extras
1457                         Perl_thread_create
1458                         Perl_nw5_init
1459                         RunPerl
1460                         AllocStdPerl
1461                         FreeStdPerl
1462                         do_spawn2
1463                         do_aspawn
1464                         nw_uname
1465                         nw_stdin
1466                         nw_stdout
1467                         nw_stderr
1468                         nw_feof
1469                         nw_ferror
1470                         nw_fopen
1471                         nw_fclose
1472                         nw_clearerr
1473                         nw_getc
1474                         nw_fgets
1475                         nw_fputc
1476                         nw_fputs
1477                         nw_fflush
1478                         nw_ungetc
1479                         nw_fileno
1480                         nw_fdopen
1481                         nw_freopen
1482                         nw_fread
1483                         nw_fwrite
1484                         nw_setbuf
1485                         nw_setvbuf
1486                         nw_vfprintf
1487                         nw_ftell
1488                         nw_fseek
1489                         nw_rewind
1490                         nw_tmpfile
1491                         nw_fgetpos
1492                         nw_fsetpos
1493                         nw_dup
1494                         nw_access
1495                         nw_chmod
1496                         nw_chsize
1497                         nw_close
1498                         nw_dup2
1499                         nw_flock
1500                         nw_isatty
1501                         nw_link
1502                         nw_lseek
1503                         nw_stat
1504                         nw_mktemp
1505                         nw_open
1506                         nw_read
1507                         nw_rename
1508                         nw_setmode
1509                         nw_unlink
1510                         nw_utime
1511                         nw_write
1512                         nw_chdir
1513                         nw_rmdir
1514                         nw_closedir
1515                         nw_opendir
1516                         nw_readdir
1517                         nw_rewinddir
1518                         nw_seekdir
1519                         nw_telldir
1520                         nw_htonl
1521                         nw_htons
1522                         nw_ntohl
1523                         nw_ntohs
1524                         nw_accept
1525                         nw_bind
1526                         nw_connect
1527                         nw_endhostent
1528                         nw_endnetent
1529                         nw_endprotoent
1530                         nw_endservent
1531                         nw_gethostbyaddr
1532                         nw_gethostbyname
1533                         nw_gethostent
1534                         nw_gethostname
1535                         nw_getnetbyaddr
1536                         nw_getnetbyname
1537                         nw_getnetent
1538                         nw_getpeername
1539                         nw_getprotobyname
1540                         nw_getprotobynumber
1541                         nw_getprotoent
1542                         nw_getservbyname
1543                         nw_getservbyport
1544                         nw_getservent
1545                         nw_getsockname
1546                         nw_getsockopt
1547                         nw_inet_addr
1548                         nw_listen
1549                         nw_socket
1550                         nw_recv
1551                         nw_recvfrom
1552                         nw_select
1553                         nw_send
1554                         nw_sendto
1555                         nw_sethostent
1556                         nw_setnetent
1557                         nw_setprotoent
1558                         nw_setservent
1559                         nw_setsockopt
1560                         nw_inet_ntoa
1561                         nw_shutdown
1562                         nw_crypt
1563                         nw_execvp
1564                         nw_kill
1565                         nw_Popen
1566                         nw_Pclose
1567                         nw_Pipe
1568                         nw_times
1569                         nw_waitpid
1570                         nw_getpid
1571                         nw_spawnvp
1572                         nw_os_id
1573                         nw_open_osfhandle
1574                         nw_get_osfhandle
1575                         nw_abort
1576                         nw_sleep
1577                         nw_wait
1578                         nw_dynaload
1579                         nw_strerror
1580                         fnFpSetMode
1581                         fnInsertHashListAddrs
1582                         fnGetHashListAddrs
1583                         Perl_deb
1584                         Perl_sv_setsv
1585                         Perl_sv_catsv
1586                         Perl_sv_catpvn
1587                         Perl_sv_2pv
1588                         nw_freeenviron
1589                         Remove_Thread_Ctx
1590                            ))
1591     {
1592         try_symbol($symbol);
1593     }
1594 }
1595
1596 # records of type boot_module for statically linked modules (except Dynaloader)
1597 $static_ext =~ s/\//__/g;
1598 $static_ext =~ s/\bDynaLoader\b//;
1599 my @stat_mods = map {"boot_$_"} grep {/\S/} split /\s+/, $static_ext;
1600 foreach my $symbol (@stat_mods)
1601     {
1602         try_symbol($symbol);
1603     }
1604
1605 try_symbol("init_Win32CORE") if $static_ext =~ /\bWin32CORE\b/;
1606
1607 # Now all symbols should be defined because
1608 # next we are going to output them.
1609
1610 foreach my $symbol (sort keys %export) {
1611     output_symbol($symbol);
1612 }
1613
1614 if ($PLATFORM eq 'os2') {
1615         print <<EOP;
1616     dll_perlmain=main
1617     fill_extLibpath
1618     dir_subst
1619     Perl_OS2_handler_install
1620
1621 ; LAST_ORDINAL=$sym_ord
1622 EOP
1623 }
1624
1625 sub emit_symbol {
1626     my $symbol = shift;
1627     chomp($symbol);
1628     $export{$symbol} = 1;
1629 }
1630
1631 sub output_symbol {
1632     my $symbol = shift;
1633     if ($PLATFORM =~ /^win(?:32|ce)$/) {
1634         $symbol = "_$symbol" if $CCTYPE eq 'BORLAND';
1635         print "\t$symbol\n";
1636 # XXX: binary compatibility between compilers is an exercise
1637 # in frustration :-(
1638 #        if ($CCTYPE eq "BORLAND") {
1639 #           # workaround Borland quirk by exporting both the straight
1640 #           # name and a name with leading underscore.  Note the
1641 #           # alias *must* come after the symbol itself, if both
1642 #           # are to be exported. (Linker bug?)
1643 #           print "\t_$symbol\n";
1644 #           print "\t$symbol = _$symbol\n";
1645 #       }
1646 #       elsif ($CCTYPE eq 'GCC') {
1647 #           # Symbols have leading _ whole process is $%@"% slow
1648 #           # so skip aliases for now
1649 #           nprint "\t$symbol\n";
1650 #       }
1651 #       else {
1652 #           # for binary coexistence, export both the symbol and
1653 #           # alias with leading underscore
1654 #           print "\t$symbol\n";
1655 #           print "\t_$symbol = $symbol\n";
1656 #       }
1657     }
1658     elsif ($PLATFORM eq 'os2') {
1659         printf qq(    %-31s \@%s\n),
1660           qq("$symbol"), $ordinal{$symbol} || ++$sym_ord;
1661         printf qq(    %-31s \@%s\n),
1662           qq("$exportperlmalloc{$symbol}" = "$symbol"),
1663           $ordinal{$exportperlmalloc{$symbol}} || ++$sym_ord
1664           if $exportperlmalloc and exists $exportperlmalloc{$symbol};
1665     }
1666     elsif ($PLATFORM eq 'aix' || $PLATFORM eq 'MacOS') {
1667         print "$symbol\n";
1668     }
1669         elsif ($PLATFORM eq 'netware') {
1670         print "\t$symbol,\n";
1671         }
1672 }
1673
1674 1;
1675 __DATA__
1676 # Oddities from PerlIO
1677 PerlIO_binmode
1678 PerlIO_getpos
1679 PerlIO_init
1680 PerlIO_setpos
1681 PerlIO_sprintf
1682 PerlIO_sv_dup
1683 PerlIO_tmpfile
1684 PerlIO_vsprintf