From a780a05d8300125196332882b8828b0a588ce7c2 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 26 Jan 2026 11:00:57 +0000 Subject: [PATCH 1/2] Run linker tests for cross binutils. Compare the native and cross results. Resolves: RHEL-117111 --- binutils.spec | 223 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 211 insertions(+), 12 deletions(-) diff --git a/binutils.spec b/binutils.spec index cd0becc..4f3c992 100644 --- a/binutils.spec +++ b/binutils.spec @@ -2,7 +2,7 @@ Summary: A GNU collection of binary utilities Name: binutils%{?_with_debug:-debug} Version: 2.41 -Release: 62%{?dist} +Release: 63%{?dist} License: GPL-3.0-or-later AND (GPL-3.0-or-later WITH Bison-exception-2.2) AND (LGPL-2.0-or-later WITH GCC-exception-2.0) AND BSD-3-Clause AND GFDL-1.3-or-later AND GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-2.0-or-later URL: https://sourceware.org/binutils @@ -121,7 +121,7 @@ URL: https://sourceware.org/binutils %endif # Create cross targeted versions of the binutils. -# For now we only do this for x86_64 hosts. +# For now we only do this for x86_64 hosts. (This is all that is needed by RHIVOS). %ifarch x86_64 %bcond_without crossbuilds %else @@ -589,7 +589,29 @@ of Linux applications. # The list of cross targets to build. %global system redhat-linux -%global cross_targets aarch64-%{system} ppc64le-%{system} s390x-%{system} x86_64-%{system} + +# Since we are currently only building cross tools for x86_64 hosts, we never need to build a +# cross-x86_64 toolchain. +# FIXME: RHIVOS currently only needs an AArch64 cross toolchain but historically we have always +# built all of the crosses. We could save time & resources by only building the AArch64 cross. + +# %%global cross_targets aarch64-%%{system} ppc64le-%%{system} s390x-%%{system} x86_64-%%{system} +%global cross_targets aarch64-%{system} ppc64le-%{system} s390x-%{system} +# %%global cross_targets aarch64-%%{system} + +%define build_cross_aarch64 1 +%define build_cross_ppc64le 1 +%define build_cross_s390x 1 +%define build_cross_x86_64 0 + +# %%define build_cross_aarch64 1 +# %%define build_cross_ppc64le 0 +# %%define build_cross_s390x 0 +# %%define build_cross_x86_64 0 + +#----Cross AArch64 ---------------------------------------------------------- + +%if %{build_cross_aarch64} %package -n cross-binutils-aarch64 Summary: Cross targeted AArch64 binutils for developer use. Not intended for production. @@ -601,10 +623,20 @@ Requires: zlib-devel BuildRequires: autoconf automake perl sed coreutils make gcc findutils gcc-c++ ExcludeArch: aarch64-linux-gnu aarch64-redhat-linux +# Wanted for testing, but currently only available on Fedora +%if 0%{?fedora} != 0 +BuildRequires: gcc-aarch64-linux-gnu +%endif + %description -n cross-binutils-aarch64 This package contains an AArch64 cross targeted version of the binutils for use by developers. It is NOT INTENDED FOR PRODUCTION use. +%endif + +#----Cross PowerPC ---------------------------------------------------------- + +%if %{build_cross_ppc64le} %package -n cross-binutils-ppc64le Summary: Cross targeted PPC64LE binutils for developer use. Not intended for production. @@ -616,10 +648,20 @@ Requires: zlib-devel BuildRequires: autoconf automake perl sed coreutils make gcc findutils gcc-c++ ExcludeArch: ppc64le-linux-gnu ppc64le-redhat-linux +# Wanted for testing, but currently only available on Fedora +%if 0%{?fedora} != 0 +BuildRequires: gcc-ppc64le-linux-gnu +%endif + %description -n cross-binutils-ppc64le This package contains a PPC64LE cross targeted version of the binutils for use by developers. It is NOT INTENDED FOR PRODUCTION use. +%endif + +#----Cross S390X ---------------------------------------------------------- + +%if %{build_cross_s390x} %package -n cross-binutils-s390x Summary: Cross targeted S390X binutils for developer use. Not intended for production. @@ -631,10 +673,20 @@ Requires: zlib-devel BuildRequires: autoconf automake perl sed coreutils make gcc findutils gcc-c++ ExcludeArch: s390x-linux-gnu s390x-redhat-linux +# Wanted for testing, but currently only available on Fedora +%if 0%{?fedora} != 0 +BuildRequires: gcc-s390x-linux-gnu +%endif + %description -n cross-binutils-s390x This package contains a S390X cross targeted version of the binutils for use by developers. It is NOT INTENDED FOR PRODUCTION use. +%endif + +#----Cross X86_64 ---------------------------------------------------------- + +%if %{build_cross_x86_64} %package -n cross-binutils-x86_64 Summary: Cross targeted X86_64 binutils for developer use. Not intended for production. @@ -646,12 +698,20 @@ Requires: zlib-devel BuildRequires: autoconf automake perl sed coreutils make gcc findutils gcc-c++ ExcludeArch: x86_64-linux-gnu x86_64-redhat-linux i686-linux-gnu i686-redhat-linux +# Wanted for testing, but currently only available on Fedora +%if 0%{?fedora} != 0 +BuildRequires: gcc-x86_64-linux-gnu +%endif + %description -n cross-binutils-x86_64 This package contains a X86_64 cross targeted version of the binutils for use by developers. It is NOT INTENDED FOR PRODUCTION use. %endif +# End of: %%if %%{with crossbuilds} +%endif + #---------------------------------------------------------------------------- %prep @@ -893,12 +953,14 @@ run_target_configuration() # Disable the GOLD linker for cross builds because although it does # support sysroots specified on the command line, it does not support # them in linker scripts via the =/$SYSROOT prefix. + # Disable GPROFNG because it does not support cross targets. SARGS="--with-sysroot=yes \ --program-prefix=$target- \ --prefix=%{_prefix}/$target \ --libdir=%{_libdir} \ --exec-prefix=%{_usr} \ --sysconfdir=%{_sysconfdir} \ + --enable-gprofng=no \ --disable-gold" fi @@ -936,7 +998,7 @@ build_target() # run_tests() # Test a built (but not installed) binutils. -# $1 is the target architecture +# $1 is the target architecture, eg x86_64-redhat-linux, aarch64-redhat-linux, etc # $2 is 1 if this is a native build # run_tests() @@ -972,10 +1034,13 @@ run_tests() make -k check-gold < /dev/null || : %endif else - # Do not try running linking tests for the cross-binutils. - make -k check-gas check-binutils < /dev/null || : + # Don't bother with gold for cross tools, even if it is built. + # Set CC and CXX so that if they are available they will be used. + make -k check-gas check-binutils check-ld CC=$target-gcc CCX=$target-gcc < /dev/null || : fi + echo ================ $target == ARCHIVE THE RESULTS OF TEST RUN 1 ====== + for f in {gas/testsuite/gas,ld/ld,binutils/binutils}.sum do if [ -f $f ]; then @@ -992,6 +1057,15 @@ run_tests() fi %endif + # Create a tarball of the results and uuencode it. This allows the full + # test results to be retrieved from the build.log file and examined + # locally. + # + # NOTE: Using uudecode to extract the tarballs from the build.log file + # will only decode the *first* uuencoded file, any others will be ignored. + # Instead the program "uudeview" should be used as this will extract *all* + # of the uuencoded files. + for file in {gas/testsuite/gas,ld/ld,binutils/binutils}.{sum,log} do if [ -f $file ]; then @@ -1001,7 +1075,6 @@ run_tests() tar cjf binutils-$target.tar.xz binutils-$target-*.{sum,log} uuencode binutils-$target.tar.xz binutils-$target.tar.xz - rm -f binutils-$target.tar.xz binutils-$target-*.{sum,log} %if %{with gold} if [ -f gold/testsuite/test-suite.log ]; then @@ -1011,16 +1084,129 @@ run_tests() fi %endif - echo ================ $target == TEST RUN 2 ============================= +%if %{with crossbuilds} + # RHIVOS: Compare the native and cross runs. This is not a fair + # comparison since the target architectures are different, but we only + # look for tests that PASS on one run and FAIL on the other. Ie tests + # that are only run for one target are ignored. As are UNSUPPORTED or + # UNTESTED tests. - # Run the tests and this time fail if there are any errors. + # NOTE: This check is basically redundant. Since the build will fail if + # *any* of the testsuites produces a FAIL or XPASS result (see test run + # 2 below) the only way a discrepancy can get through is if a test that + # should be run is not actually run. There is no way however that we can + # determine this fact without having a pre-computed list of must-be-run + # tests. + + # We are only interested in the x86_64 cross AArch64 toolchain. + # Plus the code below assumes that the native checks have completed first + # and the logs are still present after the cross checks have been run. + if test x$native != x1 && test x$target = xaarch64-%{system}; then + + local intro="RHIVOS: native vs cross comparison test" + + echo "$intro: looking for tests that PASS in one build and FAIL in the other" + + for cross_file in {gas/testsuite/gas,ld/ld,binutils/binutils}.sum + do + local native_file=%{_builddir}/binutils-%{version}/build-%{_target_platform}/$cross_file + + if [ -f $cross_file ] && [ -f $native_file ]; then + echo "$intro: comparing build-$target/$cross_file and build-%{_target_platform}/$cross_file" + + # Confirm that the files are different + if diff --report-identical-files $cross_file $native_file > /dev/null ; then + echo "$intro: ERROR: $cross_file: results files are the same" ; + # exit 1 ; + continue ; + fi + + # The command sequence below is intended to produce no results + # if the two test runs compare equally, but how can we be sure + # that there are no bugs in the logic ? The answer is to add + # a known-bad result at the start with which to check that the + # sequence is working. Note - we put the strings at the start + # of the file because if we place them at the end, the diff + # comparison algoirthm might view them as the removal of an + # old line and the addition of a new line, rather than a + # change in a single line. + + echo "PASS: command sequence test" > cross.out + cat $cross_file >> cross.out + echo "FAIL: command sequence test" > native.out + cat $native_file >> native.out + + # We then look for "command sequence test" in + # discrepancies.out. If it is there and it is the only output + # then the test has passed. If it is there but there is + # additional output then the test has failed and if the + # string is not present at all then the test is not working. + + # Using --side-by-side puts the diffs on a single line, and + # when the diff is a change (rather than an addition or + # subtraction) then the two halves are separated by the | + # character. So look for this, then look for lines that + # contain "FAIL | PASS" or "PASS | FAIL". Also "XFAIL | PASS" + # should be allowed but "XFAIL | FAIL" should not. + + diff --side-by-side cross.out native.out > diff.out || : + grep -e '|' diff.out > bar.out || : + grep -e "FAIL:" bar.out > fails.out || : + grep -e "PASS:" fails.out > passes.out || : + grep -v -e "XFAIL:" passes.out > discrepancies.out || : + grep -e "XFAIL:" bar.out > xfails.out || : + grep -v -e "PASS:" -e "UNTESTED:" xfails.out > x-discrepancies.out || : + + if grep -s -e "command sequence test" discrepancies.out > /dev/null ; then + if grep -v -s -e "command sequence test" discrepancies.out ; then + echo "$intro: $cross_file: FAILED - PASS/FAIL discrepancies exist" ; + # FIXME: Strip "command sequence test" line from discrepancies.out. + cat discrepancies.out ; + exit 1 ; + else + if grep -e XFAIL x-discrepancies.out ; then + echo "$intro: $cross_file: FAILED - XFAIL discrepancies exist" ; + cat x-discrepancies.out ; + exit 1 ; + else + echo "$intro: $cross_file: PASS - no discrepancies found" ; + fi + fi + else + echo "$intro: $cross_file: ERROR: known-bad result string not found in output file" ; + cat discrepancies.out ; + cat diff.out ; + exit 1 ; + fi + + # Tidy up. + # rm -f *.out + else + echo "$intro: ERROR: Missing test results file $cross_file and/or $native_file" + fi + done + # FIXME: Check that results are empty. + fi +%endif + + # Delete logs + rm -f binutils-$target.tar.xz binutils-$target-*.{sum,log} binutils-$target-gold.log.tar.xz + + # Run the tests for a second time, this time allowing a failed test to + # stop the build. + # + # The "make check" commands here should be exactly the same as those for + # TEST RUN 1 except that we do not run the gold tests - they always fail. + # + # FIXME: We ought to be able to record the exit codes from the first + # test run and just examine them here, instead of rerunning the tests. + + echo ================ $target == TEST RUN 2 ============================= if test x$native == x1 ; then make -k check-gas check-binutils check-ld < /dev/null - # Ignore the gold tests - they always fail else - # Do not try running linking tests for the cross-binutils. - make -k check-gas check-binutils < /dev/null + make -k check-gas check-binutils check-ld CC=$target-gcc CCX=$target-gcc < /dev/null fi popd @@ -1322,27 +1508,37 @@ exit 0 %files -f build-%{_target_platform}/binutils.lang %if %{with crossbuilds} + +%if %{build_cross_aarch64} %if "%{_target_platform}" != "aarch64-%{system}" %exclude /usr/aarch64-%{system}/* %exclude /usr/bin/aarch64-%{system}-* %endif +%endif +%if %{build_cross_ppc64le} %if "%{_target_platform}" != "ppc64le-%{system}" %exclude /usr/ppc64le-%{system}/* %exclude /usr/bin/ppc64le-%{system}-* %endif +%endif +%if %{build_cross_s390x} %if "%{_target_platform}" != "s390x-%{system}" %exclude /usr/s390x-%{system}/* %exclude /usr/bin/s390x-%{system}-* %endif +%endif +%if %{build_cross_x86_64} %if "%{_target_platform}" != "x86_64-%{system}" %exclude /usr/x86_64-%{system}/* %exclude /usr/bin/x86_64-%{system}-* %endif %endif +%endif + %license COPYING COPYING3 COPYING3.LIB COPYING.LIB %doc README %{_bindir}/[!l]* @@ -1441,6 +1637,9 @@ exit 0 #---------------------------------------------------------------------------- %changelog +* Mon Jan 26 2026 Nick Clifton - 2.41-63 +- Run linker tests for cross binutils. Compare the native and cross results. (RHEL-117111) + * Mon Jan 19 2026 Nick Clifton - 2.41-62 - Fix a potential illegal memory access when copying a corrupt input file. (RHEL-142279) From 8ec300e9325a29f43270479bed60d0f67b6ed5e0 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 28 Jan 2026 15:49:38 +0000 Subject: [PATCH 2/2] Remove redundant README. Rename bar.out to a more descriptive changed-lines.out in the native/cross testsuite results comparison code. --- binutils.spec | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/binutils.spec b/binutils.spec index 4f3c992..4b286bb 100644 --- a/binutils.spec +++ b/binutils.spec @@ -1150,11 +1150,11 @@ run_tests() # should be allowed but "XFAIL | FAIL" should not. diff --side-by-side cross.out native.out > diff.out || : - grep -e '|' diff.out > bar.out || : - grep -e "FAIL:" bar.out > fails.out || : + grep -e '|' diff.out > changed-lines.out || : + grep -e "FAIL:" changed-lines.out > fails.out || : grep -e "PASS:" fails.out > passes.out || : grep -v -e "XFAIL:" passes.out > discrepancies.out || : - grep -e "XFAIL:" bar.out > xfails.out || : + grep -e "XFAIL:" changed-lines.out > xfails.out || : grep -v -e "PASS:" -e "UNTESTED:" xfails.out > x-discrepancies.out || : if grep -s -e "command sequence test" discrepancies.out > /dev/null ; then @@ -1185,7 +1185,6 @@ run_tests() echo "$intro: ERROR: Missing test results file $cross_file and/or $native_file" fi done - # FIXME: Check that results are empty. fi %endif