diff options
Diffstat (limited to 'winsup/cygwin/speclib')
-rwxr-xr-x | winsup/cygwin/speclib | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/winsup/cygwin/speclib b/winsup/cygwin/speclib index b26644a1f..80ef23301 100755 --- a/winsup/cygwin/speclib +++ b/winsup/cygwin/speclib @@ -8,35 +8,35 @@ use strict; sub dllname($;$); my $static; -my $exclude; +my $inverse; +my @exclude; -GetOptions('static!'=>\$static, 'v|exclude!'=>\$exclude); +my ($ar, $as, $nm, $objcopy); +GetOptions('exclude=s'=>\@exclude, 'static!'=>\$static, 'v!'=>\$inverse, + 'ar=s'=>\$ar, 'as=s'=>\$as,'nm=s'=>\$nm, 'objcopy=s'=>\$objcopy); -my $nm = shift; -my $ar = shift; -my $libdll = File::Spec->rel2abs(shift @ARGV); -my $lib = File::Spec->rel2abs(pop @ARGV); +$_ = File::Spec->rel2abs($_) for @ARGV; -open my $nm_fd, '-|', $nm, '-Ap', '--defined-only', @ARGV, $libdll or +my $libdll = shift; +my $lib = pop; + +open my $nm_fd, '-|', $nm, '-Apg', '--defined-only', @ARGV, $libdll or die "$0: execution of $nm for object files failed - $!\n"; my %match_syms = (); my $symfiles = (); my $lastfn; my %extract = (); +my $exclude_regex = @exclude ? join('|', @exclude) : '\\UnLiKeLy//'; +$exclude_regex = qr/$exclude_regex/; while (<$nm_fd>) { study; - m%^\Q$libdll\E:([^:]*):\d+ i \.idata\$([56])% and do { - next; - }; - m%^\Q$libdll\E:[^:]*:\d+ I (__head_.*)$% and do { - next; - }; - next unless m%^([^:]*):([^:]*(?=:))?.* [DTI] (.*)%o; - if ($1 ne $libdll) { - $match_syms{$3} = 1; - } elsif ($match_syms{$3} ? !$exclude : $exclude) { - $extract{$2} = 1; + my ($file, $member, $symbol) = m%^([^:]*):([^:]*(?=:))?.* T (.*)%o; + next if !defined($symbol) || $symbol =~ $exclude_regex; + if ($file ne $libdll) { + $match_syms{$symbol} = 1; + } elsif ($match_syms{$symbol} ? !$inverse : $inverse) { + $extract{$member} = 1; } } close $nm_fd; |