my @def; # # Script that generates a .DEF file for all objects in a directory # # $PostgreSQL: pgsql/src/tools/msvc/gendef.pl,v 1.8 2008/01/31 16:30:24 adunstan Exp $ # die "Usage: gendef.pl \n" unless ($ARGV[0] =~ /\\([^\\]+$)/); my $defname = uc $1; if (-f "$ARGV[0]/$defname.def") { print "Not re-generating $defname.DEF, file already exists.\n"; exit(0); } print "Generating $defname.DEF from directory $ARGV[0]\n"; while (<$ARGV[0]/*.obj>) { my $symfile = $_; $symfile=~ s/\.obj$/.sym/i; print "."; system("dumpbin /symbols /out:symbols.out $_ >NUL") && die "Could not call dumpbin"; open(F, ") { s/\(\)//g; my @pieces = split; next unless $pieces[0] =~ /^[A-F0-9]{3,}$/; next unless $pieces[6]; next if ($pieces[2] eq "UNDEF"); next unless ($pieces[4] eq "External"); next if $pieces[6] =~ /^@/; next if $pieces[6] =~ /^\(/; next if $pieces[6] =~ /^__real/; next if $pieces[6] =~ /^__imp/; next if $pieces[6] =~ /NULL_THUNK_DATA$/; next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/; next if $pieces[6] =~ /^__NULL_IMPORT/; next if $pieces[6] =~ /^\?\?_C/; push @def, $pieces[6]; } close(F); rename("symbols.out",$symfile); } print "\n"; open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n"; print DEF "EXPORTS\n"; my $i = 0; my $last = ""; foreach my $f (sort @def) { next if ($f eq $last); $last = $f; $f =~ s/^_//; $i++; # print DEF " $f \@ $i\n"; # ordinaled exports? print DEF " $f\n"; } close(DEF); print "Generated $i symbols\n";