1 ######################################################################## 2 # 3 # Copyright (c) 2010, Secure Endpoints Inc. 4 # All rights reserved. 5 # 6 # Redistribution and use in source and binary forms, with or without 7 # modification, are permitted provided that the following conditions 8 # are met: 9 # 10 # - Redistributions of source code must retain the above copyright 11 # notice, this list of conditions and the following disclaimer. 12 # 13 # - Redistributions in binary form must reproduce the above copyright 14 # notice, this list of conditions and the following disclaimer in 15 # the documentation and/or other materials provided with the 16 # distribution. 17 # 18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22 # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 28 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 # POSSIBILITY OF SUCH DAMAGE. 30 # 31 32 use Getopt::Long; 33 use Pod::Usage; 34 use feature "switch"; 35 36 my $def_name = ''; 37 my $vs_name = ''; 38 my $show_help = 0; 39 40 my %syms; 41 42 my $def_only = 0; 43 my $vs_only = 0; 44 45 GetOptions ("def=s" => \$def_name, 46 "vs=s" => \$vs_name, 47 "help|?" => \$show_help) or pod2usage( -exitval => 2, 48 -verbose => 3 ); 49 pod2usage( -exitval => 1, 50 -verbose => 3 ) if $show_help or !$def_name or !$vs_name; 51 52 open (my $def, '<', $def_name) or die $!; 53 open (my $vs, '<', $vs_name) or die $!; 54 55 # First go through the version-script 56 57 my $global = 0; 58 59 while(<$vs>) 60 { 61 next unless m/^([^#]+)/; 62 63 @a = split(/\s+|({|})/,$1); 64 65 for $f (@a) { 66 given ($f) { 67 when (/global\:/) { $global = 1; } 68 when (/{|}|.*\:/) { $global = 0; } 69 when (/(.*)\;/ and $global == 1) { 70 $syms{$1} = 1; 71 } 72 } 73 } 74 } 75 76 while(<$def>) 77 { 78 next if m/^#/; 79 next unless m/^;!([^;]+)/ or m/^([^;]+);?(!?)/; 80 81 @a = split(/\s+/, $1); 82 83 for $f (@a) { 84 next if $f =~ /EXPORTS/ or $f =~ /DATA/ or not $f; 85 86 if (not exists $syms{$f} and not $2) { 87 print "$f: Only in DEF\n"; 88 ++$def_only; 89 } 90 delete $syms{$f}; 91 } 92 } 93 94 #while (($k,$v) = each %syms) { 95 for $k (sort keys %syms) { 96 print "$k: Only in VS\n"; 97 ++$vs_only; 98 } 99 100 close($def); 101 close($vs); 102 103 if ($def_only or $vs_only) { 104 print "\nMismatches found.\n"; 105 exit(1); 106 } 107 108 __END__ 109 110 =head1 NAME 111 112 w32-sync-exported-symbols.pl - Synchronize Windows .def with version-script 113 114 =head1 SYNOPSIS 115 116 w32-sync-exported-symbols.pl {options} 117 118 Options: 119 --def Name of .def file 120 --vs Name of version-script file 121 122 =head1 DESCRIPTION 123 124 Verifies that all the symbols exported by the version-script is also 125 accounted for in the .def file. Also checks that no extra symbols are 126 exported by the .def file unless they are marked as safe. 127 128 =cut 129 130