summaryrefslogtreecommitdiff
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
parent63d82fcbd27fb54b757e9ce2ae9830485446e227 (diff)
downloadzsh-bb9d76469ed0446dc5ee5ae4f03718ad09970b91.tar.gz
zsh-bb9d76469ed0446dc5ee5ae4f03718ad09970b91.zip
zsh-users/7160: Check and fix mod_export entries.
-rw-r--r--ChangeLog3
-rw-r--r--Src/Zle/zle_misc.c2
-rw-r--r--Src/Zle/zle_utils.c2
-rwxr-xr-xUtil/check_exports64
4 files changed, 69 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 2c0475ba4..c7af32d22 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2004-03-12 Peter Stephenson <pws@csr.com>
+ * zsh-users/7160: Src/Zle/zle_misc.c, Src/Zle/zle_utils.c,
+ Util/check_exports: Check and fix mod_export entries.
+
* 19615: Etc/MACHINES: update information.
2004-03-12 Oliver Kiddle <opk@zsh.org>
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index bd59653d6..1d274a93e 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -73,7 +73,7 @@ selfinsert(char **args)
}
/**/
-int
+mod_export int
selfinsertunmeta(char **args)
{
lastchar &= 0x7f;
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index 53fef20e5..69b4e6e42 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -388,7 +388,7 @@ printbind(char *str, FILE *stream)
* The message must be metafied. */
/**/
-void mod_export
+mod_export void
showmsg(char const *msg)
{
char const *p;
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}});
+ }
+ }
+}