mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 16:41:58 +00:00
ed46a99949
Fixed the shellcheck warnings in buildid.sh, record+probe_libc_inet_pton.sh and record+script_probe_vfs_getname.sh perf shell scripts: 1. Prefer [ p ] && [ q ] as [ p -a q ] is not well defined. 2. Prefer [ p ] || [ q ] as [ p -o q ] is not well defined. 3. Used * argument to avoid the argument mixes string and array 4. Resolved issue for variable refernce, where the variable is being used before it has been initialized. 5. Resolved word splitting issue (syntax error). 6. The "err" variable has been removed from buildid.sh since it is not used anywhere in the code. Signed-off-by: Samir Mulani <samir@linux.vnet.ibm.com> Cc: Disha Goel <disgoel@linux.vnet.ibm.com> Cc: Ian Rogers <irogers@google.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.g.garry@oracle.com> Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: linuxppc-dev@lists.ozlabs.org Link: https://lore.kernel.org/r/20230613164145.50488-13-atrajeev@linux.vnet.ibm.com Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
176 lines
4.1 KiB
Bash
Executable File
176 lines
4.1 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}"
|
|
|
|
id_file=${id#??}
|
|
id_dir=${id%$id_file}
|
|
link=$build_id_dir/.build-id/$id_dir/$id_file
|
|
echo "link: ${link}"
|
|
|
|
if [ ! -h $link ]; then
|
|
echo "failed: link ${link} does not exist"
|
|
exit 1
|
|
fi
|
|
|
|
file=${build_id_dir}/.build-id/$id_dir/`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 ] && [ ! -x $file ]; then
|
|
echo "failed: file ${file} executable does not exist"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -x $file ] && [ ! -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_out=$(mktemp /tmp/perf.log.out.XXX)
|
|
log_err=$(mktemp /tmp/perf.log.err.XXX)
|
|
perf="perf --buildid-dir ${build_id_dir}"
|
|
|
|
echo "running: perf record $*"
|
|
${perf} record --buildid-all -o ${data} "$@" 1>${log_out} 2>${log_err}
|
|
if [ $? -ne 0 ]; then
|
|
echo "failed: record $*"
|
|
echo "see log: ${log_err}"
|
|
exit 1
|
|
fi
|
|
|
|
args="$*"
|
|
check ${args##* }
|
|
|
|
rm -f ${log_out} ${log_err}
|
|
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 0
|