mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-03 00:03:44 +00:00
Perf test "build id cache operations" fails for PE executable. Logs
below from powerpc system. Same is observed on x86 as well.
<<>>
Adding 5a0fd882b53084224ba47b624c55a469 ./tests/shell/../pe-file.exe: Ok
build id: 5a0fd882b53084224ba47b624c55a469
link: /tmp/perf.debug.w0V/.build-id/5a/0fd882b53084224ba47b624c55a469
file: /tmp/perf.debug.w0V/.build-id/5a/../../root/<user>/linux/tools/perf/tests/pe-file.exe/5a0fd882b53084224ba47b624c55a469/elf
failed: file /tmp/perf.debug.w0V/.build-id/5a/../../root/<user>/linux/tools/perf/tests/pe-file.exe/5a0fd882b53084224ba47b624c55a469/elf does not exist
test child finished with -1
---- end ----
build id cache operations: FAILED!
<<>>
The test tries to do:
<<>>
mkdir /tmp/perf.debug.TeY1
perf --buildid-dir /tmp/perf.debug.TeY1 buildid-cache -v -a ./tests/shell/../pe-file.exe
<<>>
The option "--buildid-dir" sets the build id cache directory as
/tmp/perf.debug.TeY1. The option given to buildid-cahe, ie "-a
./tests/shell/../pe-file.exe", is to add the pe-file.exe to the cache.
The testcase, sets buildid-dir and adds the file: pe-file.exe to build
id cache. To check if the command is run successfully, "check" function
looks for presence of the file in buildid cache directory. But the check
here expects the added file to be executable. Snippet below:
<<>>
if [ ! -x $file ]; then
echo "failed: file ${file} does not exist"
exit 1
fi
<<>>
The buildid test is done for sha1 binary, md5 binary and also for PE
file. The first two binaries are created at runtime by compiling with
"--build-id" option and hence the check for sha1/md5 test should use [ !
-x ]. But in case of PE file, the permission for this input file is
rw-r--r-- Hence the file added to build id cache has same permissoin
Original file:
ls tests/pe-file.exe | xargs stat --printf "%n %A \n"
tests/pe-file.exe -rw-r--r--
buildid cache file:
ls /tmp/perf.debug.w0V/.build-id/5a/../../root/<user>/linux/tools/perf/tests/pe-file.exe/5a0fd882b53084224ba47b624c55a469/elf | xargs stat --printf "%n %A \n"
/tmp/perf.debug.w0V/.build-id/5a/../../root/<user>/linux/tools/perf/tests/pe-file.exe/5a0fd882b53084224ba47b624c55a469/elf -rw-r--r--
Fix the test to match with the permission of original file in case of FE
file. ie if the "tests/pe-file.exe" file is not having exec permission,
just check for existence of the buildid file using [ ! -e <file> ]
Signed-off-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Disha Goel <disgoel@linux.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nageswara R Sastry <rnsastry@linux.ibm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: linuxppc-dev@lists.ozlabs.org
Link: https://lore.kernel.org/r/20230116050131.17221-2-atrajeev@linux.vnet.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
172 lines
4.0 KiB
Bash
Executable File
172 lines
4.0 KiB
Bash
Executable File
#!/bin/sh
|
|
# build id cache operations
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# skip if there's no readelf
|
|
if ! [ -x "$(command -v readelf)" ]; then
|
|
echo "failed: no readelf, install binutils"
|
|
exit 2
|
|
fi
|
|
|
|
# skip if there's no compiler
|
|
if ! [ -x "$(command -v cc)" ]; then
|
|
echo "failed: no compiler, install gcc"
|
|
exit 2
|
|
fi
|
|
|
|
# check what we need to test windows binaries
|
|
add_pe=1
|
|
run_pe=1
|
|
if ! perf version --build-options | grep -q 'libbfd: .* on '; then
|
|
echo "WARNING: perf not built with libbfd. PE binaries will not be tested."
|
|
add_pe=0
|
|
run_pe=0
|
|
fi
|
|
if ! which wine > /dev/null; then
|
|
echo "WARNING: wine not found. PE binaries will not be run."
|
|
run_pe=0
|
|
fi
|
|
|
|
# set up wine
|
|
if [ ${run_pe} -eq 1 ]; then
|
|
wineprefix=$(mktemp -d /tmp/perf.wineprefix.XXX)
|
|
export WINEPREFIX=${wineprefix}
|
|
# clear display variables to prevent wine from popping up dialogs
|
|
unset DISPLAY
|
|
unset WAYLAND_DISPLAY
|
|
fi
|
|
|
|
ex_md5=$(mktemp /tmp/perf.ex.MD5.XXX)
|
|
ex_sha1=$(mktemp /tmp/perf.ex.SHA1.XXX)
|
|
ex_pe=$(dirname $0)/../pe-file.exe
|
|
|
|
echo 'int main(void) { return 0; }' | cc -Wl,--build-id=sha1 -o ${ex_sha1} -x c -
|
|
echo 'int main(void) { return 0; }' | cc -Wl,--build-id=md5 -o ${ex_md5} -x c -
|
|
|
|
echo "test binaries: ${ex_sha1} ${ex_md5} ${ex_pe}"
|
|
|
|
check()
|
|
{
|
|
case $1 in
|
|
*.exe)
|
|
# We don't have a tool that can pull a nicely formatted build-id out of
|
|
# a PE file, but we can extract the whole section with objcopy and
|
|
# format it ourselves. The .buildid section is a Debug Directory
|
|
# containing a CodeView entry:
|
|
# https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#debug-directory-image-only
|
|
# https://github.com/dotnet/runtime/blob/da94c022576a5c3bbc0e896f006565905eb137f9/docs/design/specs/PE-COFF.md
|
|
# The build-id starts at byte 33 and must be rearranged into a GUID.
|
|
id=`objcopy -O binary --only-section=.buildid $1 /dev/stdout | \
|
|
cut -c 33-48 | hexdump -ve '/1 "%02x"' | \
|
|
sed 's@^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)\(.*\)0a$@\4\3\2\1\6\5\8\7\9@'`
|
|
;;
|
|
*)
|
|
id=`readelf -n ${1} 2>/dev/null | grep 'Build ID' | awk '{print $3}'`
|
|
;;
|
|
esac
|
|
echo "build id: ${id}"
|
|
|
|
link=${build_id_dir}/.build-id/${id:0:2}/${id:2}
|
|
echo "link: ${link}"
|
|
|
|
if [ ! -h $link ]; then
|
|
echo "failed: link ${link} does not exist"
|
|
exit 1
|
|
fi
|
|
|
|
file=${build_id_dir}/.build-id/${id:0:2}/`readlink ${link}`/elf
|
|
echo "file: ${file}"
|
|
|
|
# Check for file permission of original file
|
|
# in case of pe-file.exe file
|
|
echo $1 | grep ".exe"
|
|
if [ $? -eq 0 ]; then
|
|
if [ -x $1 -a ! -x $file ]; then
|
|
echo "failed: file ${file} executable does not exist"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -x $file -a ! -e $file ]; then
|
|
echo "failed: file ${file} does not exist"
|
|
exit 1
|
|
fi
|
|
elif [ ! -x $file ]; then
|
|
echo "failed: file ${file} does not exist"
|
|
exit 1
|
|
fi
|
|
|
|
diff ${file} ${1}
|
|
if [ $? -ne 0 ]; then
|
|
echo "failed: ${file} do not match"
|
|
exit 1
|
|
fi
|
|
|
|
${perf} buildid-cache -l | grep ${id}
|
|
if [ $? -ne 0 ]; then
|
|
echo "failed: ${id} is not reported by \"perf buildid-cache -l\""
|
|
exit 1
|
|
fi
|
|
|
|
echo "OK for ${1}"
|
|
}
|
|
|
|
test_add()
|
|
{
|
|
build_id_dir=$(mktemp -d /tmp/perf.debug.XXX)
|
|
perf="perf --buildid-dir ${build_id_dir}"
|
|
|
|
${perf} buildid-cache -v -a ${1}
|
|
if [ $? -ne 0 ]; then
|
|
echo "failed: add ${1} to build id cache"
|
|
exit 1
|
|
fi
|
|
|
|
check ${1}
|
|
|
|
rm -rf ${build_id_dir}
|
|
}
|
|
|
|
test_record()
|
|
{
|
|
data=$(mktemp /tmp/perf.data.XXX)
|
|
build_id_dir=$(mktemp -d /tmp/perf.debug.XXX)
|
|
log=$(mktemp /tmp/perf.log.XXX)
|
|
perf="perf --buildid-dir ${build_id_dir}"
|
|
|
|
echo "running: perf record $@"
|
|
${perf} record --buildid-all -o ${data} $@ &> ${log}
|
|
if [ $? -ne 0 ]; then
|
|
echo "failed: record $@"
|
|
echo "see log: ${log}"
|
|
exit 1
|
|
fi
|
|
|
|
check ${@: -1}
|
|
|
|
rm -f ${log}
|
|
rm -rf ${build_id_dir}
|
|
rm -rf ${data}
|
|
}
|
|
|
|
# add binaries manual via perf buildid-cache -a
|
|
test_add ${ex_sha1}
|
|
test_add ${ex_md5}
|
|
if [ ${add_pe} -eq 1 ]; then
|
|
test_add ${ex_pe}
|
|
fi
|
|
|
|
# add binaries via perf record post processing
|
|
test_record ${ex_sha1}
|
|
test_record ${ex_md5}
|
|
if [ ${run_pe} -eq 1 ]; then
|
|
test_record wine ${ex_pe}
|
|
fi
|
|
|
|
# cleanup
|
|
rm ${ex_sha1} ${ex_md5}
|
|
if [ ${run_pe} -eq 1 ]; then
|
|
rm -r ${wineprefix}
|
|
fi
|
|
|
|
exit ${err}
|