summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/speclib
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/speclib')
-rwxr-xr-xwinsup/cygwin/speclib36
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;