All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@redhat.com>
To: Nicholas Fraser <nfraser@codeweavers.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Ian Rogers <irogers@google.com>,
	linux-kernel@vger.kernel.org,
	Ulrich Czekalla <uczekalla@codeweavers.com>,
	Huw Davies <huw@codeweavers.com>
Subject: Re: [PATCH] perf buildid-cache: Add test for PE executable
Date: Thu, 25 Feb 2021 21:35:04 +0100	[thread overview]
Message-ID: <YDgJ+JTiOsGX288R@krava> (raw)
In-Reply-To: <790bfe67-2155-a426-7130-ae7c45cb055b@codeweavers.com>

On Wed, Feb 24, 2021 at 02:59:16PM -0500, Nicholas Fraser wrote:
> From 9fd0b3889f00ad13662879767d833309d8a035b6 Mon Sep 17 00:00:00 2001
> From: Nicholas Fraser <nfraser@codeweavers.com>
> Date: Thu, 18 Feb 2021 13:24:03 -0500
> Subject: [PATCH] perf buildid-cache: Add test for PE executable
> 
> This builds on the previous changes to tests/shell/buildid.sh, adding
> tests for a PE file. It adds it to the build-id cache manually and, if
> Wine is available, runs it under "perf record" and verifies that it was
> added automatically.
> 
> If wine is not installed, only warnings are printed; the test can still
> exit 0.
> 
> Signed-off-by: Nicholas Fraser <nfraser@codeweavers.com>

works nicely now, thanks

Acked-by: Jiri Olsa <jolsa@redhat.com>

jirka

> ---
>  tools/perf/tests/shell/buildid.sh | 65 +++++++++++++++++++++++++++----
>  1 file changed, 58 insertions(+), 7 deletions(-)
> 
> diff --git a/tools/perf/tests/shell/buildid.sh b/tools/perf/tests/shell/buildid.sh
> index 416af614bbe0..f05670d1e39e 100755
> --- a/tools/perf/tests/shell/buildid.sh
> +++ b/tools/perf/tests/shell/buildid.sh
> @@ -14,18 +14,56 @@ if ! [ -x "$(command -v cc)" ]; then
>  	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}"
> +echo "test binaries: ${ex_sha1} ${ex_md5} ${ex_pe}"
>  
>  check()
>  {
> -	id=`readelf -n ${1} 2>/dev/null | grep 'Build ID' | awk '{print $3}'`
> -
> +	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}
> @@ -50,7 +88,7 @@ check()
>  		exit 1
>  	fi
>  
> -	${perf} buildid-cache -l | grep $id
> +	${perf} buildid-cache -l | grep ${id}
>  	if [ $? -ne 0 ]; then
>  		echo "failed: ${id} is not reported by \"perf buildid-cache -l\""
>  		exit 1
> @@ -79,16 +117,20 @@ 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}"
>  
> -	${perf} record --buildid-all -o ${data} ${1}
> +	echo "running: perf record $@"
> +	${perf} record --buildid-all -o ${data} $@ &> ${log}
>  	if [ $? -ne 0 ]; then
> -		echo "failed: record ${1}"
> +		echo "failed: record $@"
> +		echo "see log: ${log}"
>  		exit 1
>  	fi
>  
> -	check ${1}
> +	check ${@: -1}
>  
> +	rm -f ${log}
>  	rm -rf ${build_id_dir}
>  	rm -rf ${data}
>  }
> @@ -96,12 +138,21 @@ test_record()
>  # 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}
> -- 
> 2.30.1
> 
> 


  reply	other threads:[~2021-02-25 20:38 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-24 19:59 [PATCH] perf buildid-cache: Add test for PE executable Nicholas Fraser
2021-02-25 20:35 ` Jiri Olsa [this message]
2021-02-26 23:47   ` Arnaldo Carvalho de Melo
2021-02-27 10:17     ` Jiri Olsa
2021-03-02 12:41       ` Arnaldo Carvalho de Melo
  -- strict thread matches above, loose matches on Subject: below --
2021-02-18 18:46 Nicholas Fraser

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YDgJ+JTiOsGX288R@krava \
    --to=jolsa@redhat.com \
    --cc=acme@kernel.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=huw@codeweavers.com \
    --cc=irogers@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=nfraser@codeweavers.com \
    --cc=peterz@infradead.org \
    --cc=uczekalla@codeweavers.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.