55 else
56 FULLDUMP_CMD="$READELF -a"
57 LDD_CMD="$LDD"
58 DIS_CMD="$OBJDUMP -d"
59 STAT_PRINT_SIZE="-c %s"
60 fi
61
62 COMPARE_EXCEPTIONS_INCLUDE="$TOPDIR/make/scripts/compare_exceptions.sh.incl"
63 if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then
64 echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE"
65 exit 1
66 fi
67 # Include exception definitions
68 . "$COMPARE_EXCEPTIONS_INCLUDE"
69
70 ################################################################################
71 #
72 # Disassembly diff filters. These filters try to filter out ephemeral parts of the
73 # disassembly, such as hard-coded addresses, to be able to catch "actual" differences.
74
75 if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
76 if [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]; then
77 DIS_DIFF_FILTER="$SED \
78 -e 's/^[0-9a-f]\{16\}/<ADDR>:/' \
79 -e 's/^ *[0-9a-f]\{3,12\}:/ <ADDR>:/' \
80 -e 's/: [0-9a-f][0-9a-f]\( [0-9a-f][0-9a-f]\)\{2,10\}/: <NUMS>/' \
81 -e 's/\$[a-zA-Z0-9_\$]\{15\}\./<SYM>./' \
82 -e 's/, [0-9a-fx\-]\{1,8\}/, <ADDR>/g' \
83 -e 's/0x[0-9a-f]\{1,8\}/<HEX>/g' \
84 -e 's/\! [0-9a-f]\{1,8\} /! <ADDR> /' \
85 -e 's/call [0-9a-f]\{4,7\}/call <ADDR>/' \
86 -e 's/%hi(0),/%hi(<HEX>),/' \
87 "
88 elif [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
89 # Random strings looking like this differ: <.XAKoKoPIac2W0OA.
90 DIS_DIFF_FILTER="$SED \
91 -e 's/<\.[A-Za-z0-9]\{\15}\./<.SYM./' \
92 "
93 fi
94 elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then
95 if [ "$OPENJDK_TARGET_CPU" = "x86" ]; then
96 DIS_DIFF_FILTER="$SED -r \
97 -e 's/^ [0-9A-F]{16}: //' \
98 -e 's/^ [0-9A-F]{8}: / <ADDR>: /' \
99 -e 's/(offset \?\?)_C@_.*/\1<SYM>/' \
100 -e 's/[@?][A-Za-z0-9_]{1,25}/<SYM>/' \
101 -e 's/([-,+])[0-9A-F]{2,16}/\1<HEXSTR>/g' \
102 -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
103 -e 's/: ([a-z]{2}[a-z ]{2}) [0-9A-F]{2,16}h?$/: \1 <HEXSTR>/' \
104 -e 's/_20[0-9]{2}_[0-1][0-9]_[0-9]{2}/_<DATE>/' \
105 "
106 elif [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
107 DIS_DIFF_FILTER="$SED -r \
108 -e 's/^ [0-9A-F]{16}: //' \
109 -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
110 -e 's/([,+])[0-9A-F]{2,16}h/\1<HEXSTR>/' \
111 -e 's/([a-z]{2}[a-z ]{2}) [0-9A-F]{4,16}$/\1 <HEXSTR>/' \
112 -e 's/\[\?\?_C@_.*/[<SYM>]/' \
113 "
114 fi
441 $MKDIR -p $THIS_UNZIPDIR
442 $MKDIR -p $OTHER_UNZIPDIR
443 if [ "$TYPE" = "jar" -o "$TYPE" = "war" -o "$TYPE" = "zip" ]
444 then
445 (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP)
446 (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
447 elif [ "$TYPE" = "gz" ]
448 then
449 (cd $THIS_UNZIPDIR && $GUNZIP -c $THIS_ZIP | $TAR xf -)
450 (cd $OTHER_UNZIPDIR && $GUNZIP -c $OTHER_ZIP | $TAR xf -)
451 elif [ "$TYPE" = "jmod" ]
452 then
453 (cd $THIS_UNZIPDIR && $JMOD extract $THIS_ZIP)
454 (cd $OTHER_UNZIPDIR && $JMOD extract $OTHER_ZIP)
455 else
456 (cd $THIS_UNZIPDIR && $JIMAGE extract $THIS_ZIP)
457 (cd $OTHER_UNZIPDIR && $JIMAGE extract $OTHER_ZIP)
458 fi
459
460 CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff
461 # On solaris, there is no -q option.
462 if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
463 $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \
464 | $GREP -v -e "^<" -e "^>" -e "^Common subdirectories:" \
465 > $CONTENTS_DIFF_FILE
466 else
467 $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE
468 fi
469
470 ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE)
471 ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE)
472
473 return_value=0
474
475 if [ -n "$ONLY_OTHER" ]; then
476 echo " Only OTHER $ZIP_FILE contains:"
477 echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR| |"g | sed 's|: |/|g'
478 return_value=1
479 fi
480
481 if [ -n "$ONLY_THIS" ]; then
482 echo " Only THIS $ZIP_FILE contains:"
483 echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR| |"g | sed 's|: |/|g'
484 return_value=1
485 fi
486
487 if [ "$CMP_ZIPS_CONTENTS" = "true" ]; then
488 if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
489 DIFFING_FILES=$($GREP -e 'differ$' -e '^diff ' $CONTENTS_DIFF_FILE \
490 | $SED -e 's/^Files //g' -e 's/diff -r //g' | $CUT -f 1 -d ' ' \
491 | $SED "s|$OTHER_UNZIPDIR/||g")
492 else
493 DIFFING_FILES=$($GREP -e "differ$" $CONTENTS_DIFF_FILE \
494 | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g")
495 fi
496
497 # Separate executable/library files from other files in zip.
498 DIFFING_TEXT_FILES=
499 DIFFING_EXEC_FILES=
500 for file in $DIFFING_FILES; do
501 SUFFIX="${file##*.}"
502 if [ "$SUFFIX" = "exe" -o "$SUFFIX" = "dll" -o "$SUFFIX" = "so" \
503 -o "$SUFFIX" = "dylib" ]; then
504 DIFFING_EXEC_FILES="$DIFFING_EXEC_FILES $file"
505 else
506 DIFFING_TEXT_FILES="$DIFFING_TEXT_FILES $file"
507 fi
508 done
509
510 $RM -f $WORK_DIR/$ZIP_FILE.diffs
511 for file in $DIFFING_TEXT_FILES; do
512 if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then
513 diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs
514 fi
515 done
812 if [ "$SORT_ALL_SYMBOLS" = "true" ] || [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then
813 SYM_SORT_CMD="sort"
814 else
815 SYM_SORT_CMD="cat"
816 fi
817
818 if [ -n "$SYMBOLS_DIFF_FILTER" ] && [ -z "$NEED_SYMBOLS_DIFF_FILTER" ] \
819 || [[ "$NEED_SYMBOLS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
820 this_SYMBOLS_DIFF_FILTER="$SYMBOLS_DIFF_FILTER"
821 else
822 this_SYMBOLS_DIFF_FILTER="$CAT"
823 fi
824
825 # Check symbols
826 if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
827 # The output from dumpbin on windows differs depending on if the debug symbol
828 # files are still around at the location the binary is pointing too. Need
829 # to filter out that extra information.
830 $DUMPBIN -exports $OTHER_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
831 $DUMPBIN -exports $THIS_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
832 elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
833 # Some symbols get seemingly random 15 character prefixes. Filter them out.
834 $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
835 $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
836 elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
837 $OBJDUMP -T $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
838 $OBJDUMP -T $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
839 elif [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
840 $NM -j $ORIG_OTHER_FILE 2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
841 $NM -j $ORIG_THIS_FILE 2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
842 else
843 $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME \
844 | $AWK '{print $2, $3, $4, $5}' \
845 | eval "$this_SYMBOLS_DIFF_FILTER" \
846 | $SYM_SORT_CMD \
847 > $WORK_FILE_BASE.symbols.other
848 $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME \
849 | $AWK '{print $2, $3, $4, $5}' \
850 | eval "$this_SYMBOLS_DIFF_FILTER" \
851 | $SYM_SORT_CMD \
852 > $WORK_FILE_BASE.symbols.this
853 fi
854
855 $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
|
55 else
56 FULLDUMP_CMD="$READELF -a"
57 LDD_CMD="$LDD"
58 DIS_CMD="$OBJDUMP -d"
59 STAT_PRINT_SIZE="-c %s"
60 fi
61
62 COMPARE_EXCEPTIONS_INCLUDE="$TOPDIR/make/scripts/compare_exceptions.sh.incl"
63 if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then
64 echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE"
65 exit 1
66 fi
67 # Include exception definitions
68 . "$COMPARE_EXCEPTIONS_INCLUDE"
69
70 ################################################################################
71 #
72 # Disassembly diff filters. These filters try to filter out ephemeral parts of the
73 # disassembly, such as hard-coded addresses, to be able to catch "actual" differences.
74
75 if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
76 if [ "$OPENJDK_TARGET_CPU" = "x86" ]; then
77 DIS_DIFF_FILTER="$SED -r \
78 -e 's/^ [0-9A-F]{16}: //' \
79 -e 's/^ [0-9A-F]{8}: / <ADDR>: /' \
80 -e 's/(offset \?\?)_C@_.*/\1<SYM>/' \
81 -e 's/[@?][A-Za-z0-9_]{1,25}/<SYM>/' \
82 -e 's/([-,+])[0-9A-F]{2,16}/\1<HEXSTR>/g' \
83 -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
84 -e 's/: ([a-z]{2}[a-z ]{2}) [0-9A-F]{2,16}h?$/: \1 <HEXSTR>/' \
85 -e 's/_20[0-9]{2}_[0-1][0-9]_[0-9]{2}/_<DATE>/' \
86 "
87 elif [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
88 DIS_DIFF_FILTER="$SED -r \
89 -e 's/^ [0-9A-F]{16}: //' \
90 -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
91 -e 's/([,+])[0-9A-F]{2,16}h/\1<HEXSTR>/' \
92 -e 's/([a-z]{2}[a-z ]{2}) [0-9A-F]{4,16}$/\1 <HEXSTR>/' \
93 -e 's/\[\?\?_C@_.*/[<SYM>]/' \
94 "
95 fi
422 $MKDIR -p $THIS_UNZIPDIR
423 $MKDIR -p $OTHER_UNZIPDIR
424 if [ "$TYPE" = "jar" -o "$TYPE" = "war" -o "$TYPE" = "zip" ]
425 then
426 (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP)
427 (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
428 elif [ "$TYPE" = "gz" ]
429 then
430 (cd $THIS_UNZIPDIR && $GUNZIP -c $THIS_ZIP | $TAR xf -)
431 (cd $OTHER_UNZIPDIR && $GUNZIP -c $OTHER_ZIP | $TAR xf -)
432 elif [ "$TYPE" = "jmod" ]
433 then
434 (cd $THIS_UNZIPDIR && $JMOD extract $THIS_ZIP)
435 (cd $OTHER_UNZIPDIR && $JMOD extract $OTHER_ZIP)
436 else
437 (cd $THIS_UNZIPDIR && $JIMAGE extract $THIS_ZIP)
438 (cd $OTHER_UNZIPDIR && $JIMAGE extract $OTHER_ZIP)
439 fi
440
441 CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff
442 $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE
443
444 ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE)
445 ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE)
446
447 return_value=0
448
449 if [ -n "$ONLY_OTHER" ]; then
450 echo " Only OTHER $ZIP_FILE contains:"
451 echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR| |"g | sed 's|: |/|g'
452 return_value=1
453 fi
454
455 if [ -n "$ONLY_THIS" ]; then
456 echo " Only THIS $ZIP_FILE contains:"
457 echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR| |"g | sed 's|: |/|g'
458 return_value=1
459 fi
460
461 if [ "$CMP_ZIPS_CONTENTS" = "true" ]; then
462 DIFFING_FILES=$($GREP -e "differ$" $CONTENTS_DIFF_FILE \
463 | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g")
464
465 # Separate executable/library files from other files in zip.
466 DIFFING_TEXT_FILES=
467 DIFFING_EXEC_FILES=
468 for file in $DIFFING_FILES; do
469 SUFFIX="${file##*.}"
470 if [ "$SUFFIX" = "exe" -o "$SUFFIX" = "dll" -o "$SUFFIX" = "so" \
471 -o "$SUFFIX" = "dylib" ]; then
472 DIFFING_EXEC_FILES="$DIFFING_EXEC_FILES $file"
473 else
474 DIFFING_TEXT_FILES="$DIFFING_TEXT_FILES $file"
475 fi
476 done
477
478 $RM -f $WORK_DIR/$ZIP_FILE.diffs
479 for file in $DIFFING_TEXT_FILES; do
480 if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then
481 diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs
482 fi
483 done
780 if [ "$SORT_ALL_SYMBOLS" = "true" ] || [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then
781 SYM_SORT_CMD="sort"
782 else
783 SYM_SORT_CMD="cat"
784 fi
785
786 if [ -n "$SYMBOLS_DIFF_FILTER" ] && [ -z "$NEED_SYMBOLS_DIFF_FILTER" ] \
787 || [[ "$NEED_SYMBOLS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
788 this_SYMBOLS_DIFF_FILTER="$SYMBOLS_DIFF_FILTER"
789 else
790 this_SYMBOLS_DIFF_FILTER="$CAT"
791 fi
792
793 # Check symbols
794 if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
795 # The output from dumpbin on windows differs depending on if the debug symbol
796 # files are still around at the location the binary is pointing too. Need
797 # to filter out that extra information.
798 $DUMPBIN -exports $OTHER_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
799 $DUMPBIN -exports $THIS_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
800 elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
801 $OBJDUMP -T $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
802 $OBJDUMP -T $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
803 elif [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
804 $NM -j $ORIG_OTHER_FILE 2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
805 $NM -j $ORIG_THIS_FILE 2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
806 else
807 $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME \
808 | $AWK '{print $2, $3, $4, $5}' \
809 | eval "$this_SYMBOLS_DIFF_FILTER" \
810 | $SYM_SORT_CMD \
811 > $WORK_FILE_BASE.symbols.other
812 $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME \
813 | $AWK '{print $2, $3, $4, $5}' \
814 | eval "$this_SYMBOLS_DIFF_FILTER" \
815 | $SYM_SORT_CMD \
816 > $WORK_FILE_BASE.symbols.this
817 fi
818
819 $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
|