summaryrefslogtreecommitdiff
path: root/Util/check_exports
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2004-03-12 18:56:42 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2004-03-12 18:56:42 +0000
commitbb9d76469ed0446dc5ee5ae4f03718ad09970b91 (patch)
tree85e02a26cd4ec9b4210f34a34a65a49e04cfb33e /Util/check_exports
parent63d82fcbd27fb54b757e9ce2ae9830485446e227 (diff)
downloadzsh-bb9d76469ed0446dc5ee5ae4f03718ad09970b91.tar.gz
zsh-bb9d76469ed0446dc5ee5ae4f03718ad09970b91.zip
zsh-users/7160: Check and fix mod_export entries.
Diffstat (limited to 'Util/check_exports')
-rwxr-xr-xUtil/check_exports64
1 files changed, 64 insertions, 0 deletions
diff --git a/Util/check_exports b/Util/check_exports
new file mode 100755
index 000000000..7b56d3015
--- /dev/null
+++ b/Util/check_exports
@@ -0,0 +1,64 @@
+#!/usr/local/bin/perl -w
+
+# Attempt to scan executable, libraries, and .export files after
+# a zsh build to see if all necessary symbols appear in the .export file
+# (and hence with `mod_export' in the source file). This keeps AIX happy.
+# Probably severely system dependent, but known to run on Fedora Core 1,
+# at least. Not needed on AIX itself... you can tell if doesn't link.
+
+if (! -f "zsh") {
+ die "Can't file zsh, are we in the Src directory of the build?\n";
+}
+
+my (%defined, %undefined, %exported);
+
+foreach my $file ("zsh", glob("*.so */*.so")) {
+ next unless -f $file;
+
+ my $exports = $file;
+ $exports =~ s/\.so//;
+ $exports .= ".export";
+ if (-f $exports) {
+ open EXPORT, $exports or die "Can't read $exports: $!\n";
+ my $href = $exported{$file} = { };
+ while (<EXPORT>) {
+ next if /^#/;
+ chomp;
+ $href->{$_} = 1;
+ }
+ close EXPORT;
+ } else {
+ warn "Hmmm... no .exports file for $file\n";
+ }
+
+ open PIPE, "nm $file |" or die "Can't popen nm";
+ while (<PIPE>) {
+ s/^[0-9a-f]*\s+//;
+ my ($type, $sym) = split;
+ # ignore local symbols (lower case)
+ if ($type =~ /^[TBAD]/) {
+ if (!defined $defined{$sym}) {
+ $defined{$sym} = $file;
+ }
+ } elsif ($type eq 'U') {
+ # could skip undefined from zsh and zsh.so, but what the heck
+ my $ref = \$undefined{$sym};
+ if (defined $$ref) {
+ push @$$ref, $file;
+ } else {
+ $$ref = [ $file ];
+ }
+ }
+ }
+ close PIPE or die "nm failed";
+}
+
+foreach $sym (keys %undefined) {
+ my $deffile = $defined{$sym};
+ if (defined $deffile) {
+ if (!$exported{$deffile}{$sym}) {
+ printf "%-20s: %-20s: %s\n", $sym, $defined{$sym},
+ join(" ", @{$undefined{$sym}});
+ }
+ }
+}