]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3271. [port] darwin: mksymtbl is not always stable, loop several
authorMark Andrews <marka@isc.org>
Tue, 31 Jan 2012 04:10:45 +0000 (04:10 +0000)
committerMark Andrews <marka@isc.org>
Tue, 31 Jan 2012 04:10:45 +0000 (04:10 +0000)
                        times before giving up.  mksymtbl was using non
                        portable perl to covert 64 bit hex strings. [RT #27653]

CHANGES
make/rules.in
util/mksymtbl.pl

diff --git a/CHANGES b/CHANGES
index ded8bc2a9574808031d40ce9bc804a31e8aa95b0..d7631d73bea73065c1a4ea788e8d924a36517243 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+3271.  [port]          darwin: mksymtbl is not always stable, loop several
+                       times before giving up.  mksymtbl was using non
+                       portable perl to covert 64 bit hex strings. [RT #27653]
+
        --- 9.9.0rc2 released ---
 
 3270.  [bug]           "rndc reload" didn't reuse existing zones correctly
index c736967845f657a0c09f40df06ba49971cadcbd0..7ba3b79dc3de2c6dbfdb4a370b224e89cca1c0c5 100644 (file)
@@ -13,7 +13,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: rules.in,v 1.72 2011/12/20 05:24:18 marka Exp $
+# $Id: rules.in,v 1.72.22.1 2012/01/31 04:10:45 marka Exp $
 
 ###
 ### Common Makefile rules for BIND 9.
@@ -214,7 +214,21 @@ FINALBUILDCMD = if [ X"${MKSYMTBL_PROGRAM}" = X -o X"$${MAKE_SYMTABLE:-${ALWAYS_
                -o $@tmp2 $${BASEOBJS} $@-symtbl.@O@ $${LIBS0} ${NOSYMLIBS}; \
                ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
                -o $@-symtbl2.c $@tmp2; \
-               diff $@-symtbl.c $@-symtbl2.c || exit 1;\
+               count=0; \
+               until diff $@-symtbl.c $@-symtbl2.c > /dev/null ; \
+               do \
+                       count=`expr $$count + 1` ; \
+                       test $$count = 42 && exit 1 ; \
+                       rm -f $@-symtbl.c $@-symtbl.@O@; \
+                       ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+                       -o $@-symtbl.c $@tmp2 || exit 1; \
+                       $(MAKE) $@-symtbl.@O@ || exit 1; \
+                       ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} \
+                       ${LDFLAGS} -o $@tmp2 $${BASEOBJS} $@-symtbl.@O@ \
+                       $${LIBS0} ${NOSYMLIBS}; \
+                       ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+                       -o $@-symtbl2.c $@tmp2; \
+               done ; \
                mv $@tmp2 $@; \
                rm -f $@tmp0 $@tmp1 $@tmp2 $@-symtbl2.c; \
        fi
index 5a432ab0ea7f3e6d1088af41beb88c72886b03f4..b1b02f0b2477d725d455ab19a8d42718f43399e3 100755 (executable)
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: mksymtbl.pl,v 1.4 2009/10/05 22:39:09 jinmei Exp $
+# $Id: mksymtbl.pl,v 1.4.688.1 2012/01/31 04:10:45 marka Exp $
 
 use strict;
 use diagnostics;
 $^W = 1;
 
-my $rev = '$Id: mksymtbl.pl,v 1.4 2009/10/05 22:39:09 jinmei Exp $';
+my $rev = '$Id: mksymtbl.pl,v 1.4.688.1 2012/01/31 04:10:45 marka Exp $';
 $rev =~ s/\$//g;
 $rev =~ s/,v//g;
 $rev =~ s/Id: //;
@@ -95,11 +95,25 @@ while (<SYMBOLS>) {
        }
 }
 
+sub lhex {
+       my $la = substr($a, -8);
+       my $lb = substr($b, -8);
+       my $ha = substr($a, 0, length($a) - length($la));
+       my $hb = substr($b, 0, length($b) - length($lb));
+       $ha = "0" if ($ha eq "");
+       $ha = "0" if ($hb eq "");
+       if (hex($ha) != hex($hb)) {
+               $la = $ha;
+               $lb = $hb;
+       }
+       hex($la) <=> hex($lb)
+}
+
 print TBLFILE "/*\n * Generated by $rev \n */\n";
 print TBLFILE "#include <isc/backtrace.h>\n";
 print TBLFILE "const int isc__backtrace_nsymbols = $nsyms;\n";
 print TBLFILE "const isc_backtrace_symmap_t isc__backtrace_symtable[] = {\n";
-foreach (sort {hex($a) <=> hex($b)} keys(%symmap)) {
+foreach (sort lhex keys(%symmap)) {
        my ($addr, $symbol) = ($_, $symmap{$_});
        if ($need_uscorefix && $symbol =~ /^_(.*)/) {
                $symbol = $1;