diff --git a/CHANGES b/CHANGES index 87ee1906a6..25ca425762 100644 --- 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] + 3271. [func] New "rndc zonestatus" command prints information about the specified zone. [RT #21671] diff --git a/make/rules.in b/make/rules.in index c736967845..9763ce6c84 100644 --- a/make/rules.in +++ b/make/rules.in @@ -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.73 2012/01/31 04:08:07 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 diff --git a/util/mksymtbl.pl b/util/mksymtbl.pl index 5a432ab0ea..1ad78be07d 100755 --- a/util/mksymtbl.pl +++ b/util/mksymtbl.pl @@ -14,13 +14,13 @@ # 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.5 2012/01/31 04:08:07 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.5 2012/01/31 04:08:07 marka Exp $'; $rev =~ s/\$//g; $rev =~ s/,v//g; $rev =~ s/Id: //; @@ -95,11 +95,25 @@ while () { } } +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 \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;