Hi Mark,
On Tue, Feb 10, 2026 at 12:34 PM Mark Wielaard <[email protected]> wrote:
>
> clang with -flto produces object files that contain bitcode. This
> breaks various (self) testcases that expect those .o files are ELF
> files. readelf, nm, elfcheck and elfcompress won't work on such files.
>
> Add a helper function is_obj_bitcode in test-subr.sh that tests can
> use to possibly skip a check on an .o file.
>
> * tests/test-subr.sh (is_obj_bitcode): New function.
> (testrun_on_self): Use is_obj_bitcode to possibly skip a file.
> (testrun_on_self_obj): Likewise.
> (testrun_on_self_compressed): Likewise.
> (testrun_on_self_quiet): Likewise.
> * tests/run-elfclassify-self.sh: Check if the object files are
> actually ELF files.
> * tests/run-nm-self.sh: Use is_obj_bitcode to possibly skip file.
> * tests/run-reverse-sections-self.sh: Likewise.
> * tests/run-strip-reloc-self.sh: Likewise.
> * tests/run-strip-strmerge.sh: Likewise.
> * tests/strip-reloc-subr.sh: Likewise.
>
> Signed-off-by: Mark Wielaard <[email protected]>
LGTM.
Aaron
> ---
> tests/run-elfclassify-self.sh | 9 +++++++--
> tests/run-nm-self.sh | 6 +++++-
> tests/run-reverse-sections-self.sh | 6 +++++-
> tests/run-strip-reloc-self.sh | 4 ++++
> tests/run-strip-strmerge.sh | 4 ++++
> tests/strip-reloc-subr.sh | 5 +++++
> tests/test-subr.sh | 24 ++++++++++++++++++++++++
> 7 files changed, 54 insertions(+), 4 deletions(-)
>
> diff --git a/tests/run-elfclassify-self.sh b/tests/run-elfclassify-self.sh
> index c48ab9c93e92..4d86cb24e711 100755
> --- a/tests/run-elfclassify-self.sh
> +++ b/tests/run-elfclassify-self.sh
> @@ -32,5 +32,10 @@ testrun_on_self_exe ${abs_top_builddir}/src/elfclassify
> --program
> testrun_on_self_exe ${abs_top_builddir}/src/elfclassify --loadable
> testrun_on_self_exe ${abs_top_builddir}/src/elfclassify --not-shared
>
> -testrun ${abs_top_builddir}/src/elfclassify --not-shared $self_test_files_obj
> -testrun ${abs_top_builddir}/src/elfclassify --not-executable
> $self_test_files_obj
> +# Check if the object files are actually ELF files (could be bitcode lto)
> +if ${abs_top_builddir}/src/elfclassify -v --elf $self_test_files_obj; then
> + testrun ${abs_top_builddir}/src/elfclassify --not-shared
> $self_test_files_obj
> + testrun ${abs_top_builddir}/src/elfclassify --not-executable
> $self_test_files_obj
> +else
> + echo "*** Skipping testing not ELF files $self_test_files_obj"
> +fi
> diff --git a/tests/run-nm-self.sh b/tests/run-nm-self.sh
> index 6a31afcf6bed..e7d7c58d41d0 100755
> --- a/tests/run-nm-self.sh
> +++ b/tests/run-nm-self.sh
> @@ -28,7 +28,11 @@ for what_arg in --debug-syms --defined-only --dynamic
> --extern-only; do
> for self_file in $ET_REL $ET_EXEC $ET_DYN; do
> # --dynamic doesn't make sense for ET_REL.
> if ! test "$what_arg" = "--dynamic" -a "$self_file" = "$ET_REL"; then
> - testrun ${abs_top_builddir}/src/nm $what_arg $format_arg $out_arg
> $self_file > /dev/null
> + if is_obj_bitcode "$self_file"; then
> + echo "*** skipping bitcode file $self_file"
> + else
> + testrun ${abs_top_builddir}/src/nm $what_arg $format_arg $out_arg
> $self_file > /dev/null
> + fi
> fi
> done
> done
> diff --git a/tests/run-reverse-sections-self.sh
> b/tests/run-reverse-sections-self.sh
> index 71afd6aca1f1..d241775993d9 100755
> --- a/tests/run-reverse-sections-self.sh
> +++ b/tests/run-reverse-sections-self.sh
> @@ -39,7 +39,11 @@ test_reverse_self ()
> # Only really makes sense for ET_REL files, but try all, just to check
> # it also works if we keep the order for the allocated sections.
> for file in $self_test_files; do
> - test_reverse_self $file
> + if is_obj_bitcode "$file"; then
> + echo "*** skipping bitcode file $file"
> + else
> + test_reverse_self $file
> + fi
> done
>
> exit 0
> diff --git a/tests/run-strip-reloc-self.sh b/tests/run-strip-reloc-self.sh
> index 68ed4cc2702b..73f5b6c36606 100755
> --- a/tests/run-strip-reloc-self.sh
> +++ b/tests/run-strip-reloc-self.sh
> @@ -8,6 +8,10 @@ runtest ${abs_top_builddir}/src/strip.o 1
>
> # Copy ET_REL file for self-test and make sure to run with/without
> # elf section compression.
> +if is_obj_bitcode ${abs_top_builddir}/src/strip.o; then
> + echo "*** skipping bitcode file"
> + exit $runtest_status
> +fi
> tempfiles strip-uncompressed.o strip-compressed.o
> testrun ${abs_top_builddir}/src/elfcompress -o strip-uncompressed.o -t none \
> ${abs_top_builddir}/src/strip.o
> diff --git a/tests/run-strip-strmerge.sh b/tests/run-strip-strmerge.sh
> index aa9c1eb93283..0d24adef90b9 100755
> --- a/tests/run-strip-strmerge.sh
> +++ b/tests/run-strip-strmerge.sh
> @@ -50,6 +50,10 @@ testrun ${abs_top_builddir}/src/elfcmp $merged $remerged
>
> # A random ET_REL file
> input=${abs_top_builddir}/tests/elfstrmerge.o
> +if is_obj_bitcode "$input"; then
> + echo "*** skipping bitcode file $self_file"
> + exit 0
> +fi
> merged=merged.elf
> stripped=${merged}.stripped
> debugfile=${merged}.debug
> diff --git a/tests/strip-reloc-subr.sh b/tests/strip-reloc-subr.sh
> index c4d55ced1596..045f5b0798ba 100755
> --- a/tests/strip-reloc-subr.sh
> +++ b/tests/strip-reloc-subr.sh
> @@ -36,6 +36,11 @@ runtest() {
>
> echo "runtest $infile"
>
> + if is_obj_bitcode "$infile"; then
> + echo "*** skipping bitcode file $infile"
> + return
> + fi
> +
> rm -f $outfile1 $debugfile1 $outfile2 $debugfile2
>
> testrun ${abs_top_builddir}/src/strip -o $outfile1 -f $debugfile1 $infile
> ||
> diff --git a/tests/test-subr.sh b/tests/test-subr.sh
> index 2a956b47de2f..623b5b774511 100644
> --- a/tests/test-subr.sh
> +++ b/tests/test-subr.sh
> @@ -1,5 +1,6 @@
> #! /bin/sh
> # Copyright (C) 2005-2015, 2017 Red Hat, Inc.
> +# Copyright (C) 2026 Mark J. Wielaard <[email protected]>
> # This file is part of elfutils.
> #
> # This file is free software; you can redistribute it and/or modify
> @@ -118,6 +119,13 @@ program_transform()
> echo "$*" | sed "${program_transform_name}"
> }
>
> +is_obj_bitcode()
> +{
> + bcfile="$1"
> + BC=$(od -An -tx2 -N2 "$bcfile" | sed -e 's/^[[:space:]]*//')
> + if [ "'$BC'" = "'4342'" ]; then return 0; else return 1; fi
> +}
> +
> self_test_files_exe=`echo ${abs_top_builddir}/src/addr2line \
> ${abs_top_builddir}/src/elfclassify \
> ${abs_top_builddir}/src/stack \
> @@ -137,8 +145,12 @@ testrun_on_self()
> exit_status=0
>
> for file in $self_test_files; do
> + if is_obj_bitcode "$file"; then
> + echo "*** skipping bitcode file in $* $file"
> + else
> testrun $* $file \
> || { echo "*** failure in $* $file"; exit_status=1; }
> + fi
> done
>
> # Only exit if something failed
> @@ -176,8 +188,12 @@ testrun_on_self_obj()
> exit_status=0
>
> for file in $self_test_files_obj; do
> + if is_obj_bitcode "$file"; then
> + echo "*** skipping bitcode file in $* $file"
> + else
> testrun $* $file \
> || { echo "*** failure in $* $file"; exit_status=1; }
> + fi
> done
>
> # Only exit if something failed
> @@ -190,12 +206,16 @@ testrun_on_self_compressed()
> exit_status=0
>
> for file in $self_test_files; do
> + if is_obj_bitcode "$file"; then
> + echo "*** skipping bitcode file in $* $file"
> + else
> tempfiles ${file}z
> testrun ${abs_top_builddir}/src/elfcompress -f -q -o ${file}z ${file}
> testrun ${abs_top_builddir}/src/elfcompress -f -q --name='.s??tab'
> ${file}z
>
> testrun $* ${file}z \
> || { echo "*** failure in $* ${file}z"; exit_status=1; }
> + fi
> done
>
> # Only exit if something failed
> @@ -208,8 +228,12 @@ testrun_on_self_quiet()
> exit_status=0
>
> for file in $self_test_files; do
> + if is_obj_bitcode "$file"; then
> + echo "*** skipping bitcode file in $* $file"
> + else
> testrun $* $file > /dev/null \
> || { echo "*** failure in $* $file"; exit_status=1; }
> + fi
> done
>
> # Only exit if something failed
> --
> 2.52.0
>