Check the export lists against the newly built shared library to make sure all
authorKen Raeburn <raeburn@mit.edu>
Wed, 25 Jan 2006 06:35:19 +0000 (06:35 +0000)
committerKen Raeburn <raeburn@mit.edu>
Wed, 25 Jan 2006 06:35:19 +0000 (06:35 +0000)
the symbols we want to export are actually defined.  GNU/Linux only, for the
moment, but it ought to work on any system using the GNU version of nm, and not
too hard to modify for other ways of extracting the exported symbols of a
library.

* util/export-check.pl: New file.
* config/shlib.conf (*-*-linux*): Run export-check.pl after building a shared
library.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17609 dc483132-0cff-0310-8789-dd5450dbe970

src/config/ChangeLog
src/config/shlib.conf
src/util/ChangeLog
src/util/export-check.pl [new file with mode: 0755]

index 6296210ad0bdb4351a6731f6664ab8abcefb2486..5bfca9ee6446d6764121730e8d09c2f06972e334 100644 (file)
@@ -1,5 +1,8 @@
 2006-01-25  Ken Raeburn  <raeburn@mit.edu>
 
+       * shlib.conf (*-*-linux*): Run export-check.pl after building a
+       shared library.
+
        * lib.in (binutils.versions): Put hidden symbol list after
        exported list, because libkrb4 has a symbol starting with "__" in
        its export list.
index 9d9a2066b769dfd50f2320f12b724cdfc584a9bb..a7ec085c327bcd94c5649beb0f1af058ab0b5df3 100644 (file)
@@ -354,7 +354,7 @@ mips-*-netbsd*)
        # Use objdump -x to examine the fields of the library
        LDCOMBINE='$(CC) -shared -fPIC -Wl,-h,$(LIBPREFIX)$(LIBBASE)$(SHLIBSEXT)'
        # 
-       LDCOMBINE_TAIL='-Wl,--version-script binutils.versions'
+       LDCOMBINE_TAIL='-Wl,--version-script binutils.versions && $(PERL) -w $(SRCTOP)/util/export-check.pl $(SHLIB_EXPORT_FILE) $@'
        SHLIB_EXPORT_FILE_DEP=binutils.versions
        # For cases where we do have dependencies on other libraries
        # built in this tree...
index a306f5d92aed327c967e2b1fd67f698a60ec7344..b7c87caa5a9bd3f152b6be741d3f168d1e9a1a6e 100644 (file)
@@ -1,3 +1,7 @@
+2006-01-25  Ken Raeburn  <raeburn@mit.edu>
+
+       * export-check.pl: New file.
+
 2005-12-22  Ken Raeburn  <raeburn@mit.edu>
 
        * depfix.pl (uniquify): New subroutine.
diff --git a/src/util/export-check.pl b/src/util/export-check.pl
new file mode 100755 (executable)
index 0000000..67c8e85
--- /dev/null
@@ -0,0 +1,55 @@
+#
+$0 =~ s/^.*?([\w.-]+)$/$1/;
+
+# The real stuff.
+
+# Args: exportlist libfoo.so
+
+# This code assumes the GNU version of nm.
+# For now, we'll only run it on GNU/Linux systems, so that's okay.
+
+if ($#ARGV != 1) {
+    die "usage: $0 exportfile libfoo.so\n";
+}
+my($exfile, $libfile) = @ARGV;
+
+@missing = ();
+open NM, "nm -Dg --defined-only $libfile |" || die "can't run nm on $libfile: $!";
+open EXPORT, "< $exfile" || die "can't read $exfile: $!";
+
+@export = <EXPORT>;
+map chop, @export;
+@export = sort @export;
+
+@found = ();
+while (<NM>) {
+    chop;
+    s/^[0-9a-fA-F]+ +//;
+    next if /^A /;
+    if (!/^[TDRB] /) {
+       unlink $libfile;
+       die "not sure what to do with '$_'";
+    }
+    s/^[TDRB] +//;
+    push @found, $_;
+}
+@found = sort @found;
+while ($#export >= 0 && $#found >= 0) {
+    if ($export[0] eq $found[0]) {
+#      print "ok $export[0]\n";
+       shift @export;
+       shift @found;
+    } elsif ($export[0] lt $found[0]) {
+       push @missing, shift @export;
+    } else {
+       # Ignore added symbols, for now.
+       shift @found;
+    }
+}
+if ($#export >= 0) { @missing = (@missing, @export); }
+if ($#missing >= 0) {
+    print STDERR "Missing symbols:\n\t", join("\n\t", @missing), "\n";
+#    unlink $libfile;
+    exit(1);
+}
+exit 0;