All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Remi Bernon <rbernon@codeweavers.com>,
	Nicholas Fraser <nfraser@codeweavers.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
	linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] perf symbol: Look for ImageBase in PE file to compute .text offset
Date: Thu, 9 Sep 2021 17:27:58 -0300	[thread overview]
Message-ID: <YTpuTiYzkTKbUM/l@kernel.org> (raw)
In-Reply-To: <20210909192637.4139125-1-rbernon@codeweavers.com>

Em Thu, Sep 09, 2021 at 09:26:36PM +0200, Remi Bernon escreveu:
> Instead of using the file offset in the debug file.
> 
> This fixes a regression from 00a3423492bc90be99e529a64f13fdd80a0e8c0a,
> causing incorrect symbol resolution when debug file have been stripped
> from non-debug sections (in which case its .text section is empty and
> doesn't have any file position).
> 
> The debug files could also be created with a different file alignment,
> and have different file positions from the mmap-ed binary, or have the
> section reordered.
> 
> This instead looks for the file image base, using the corresponding bfd
> *ABS* symbols. As PE symbols only have 4 bytes, it also needs to keep
> .text section vma high bits.

I added a:

Fixes: 00a3423492bc90be ("perf symbols: Make dso__load_bfd_symbols() load PE files from debug cache only")

To help stable@kernel.org to pick it, its on my local tree now.

It would be great to get a:

Reviewed-by: Nicholas Fraser <nfraser@codeweavers.com> 

Can we have it, please?

- Arnaldo

> Signed-off-by: Remi Bernon <rbernon@codeweavers.com>
> ---
> 
> Hi!
> 
> As I'm not updating it often I only recently realized that perf had a
> regression when using stripped debug info files, and all symbols from
> PE files are off. This should make things better.
> 
> Cheers,
> 
>  tools/perf/util/symbol.c | 20 ++++++++++++++++----
>  1 file changed, 16 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index 77fc46ca07c0..0fc9a5410739 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -1581,10 +1581,6 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
>  	if (bfd_get_flavour(abfd) == bfd_target_elf_flavour)
>  		goto out_close;
>  
> -	section = bfd_get_section_by_name(abfd, ".text");
> -	if (section)
> -		dso->text_offset = section->vma - section->filepos;
> -
>  	symbols_size = bfd_get_symtab_upper_bound(abfd);
>  	if (symbols_size == 0) {
>  		bfd_close(abfd);
> @@ -1602,6 +1598,22 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
>  	if (symbols_count < 0)
>  		goto out_free;
>  
> +	section = bfd_get_section_by_name(abfd, ".text");
> +	if (section) {
> +		for (i = 0; i < symbols_count; ++i) {
> +			if (!strcmp(bfd_asymbol_name(symbols[i]), "__ImageBase") ||
> +			    !strcmp(bfd_asymbol_name(symbols[i]), "__image_base__"))
> +				break;
> +		}
> +		if (i < symbols_count) {
> +			/* PE symbols can only have 4 bytes, so use .text high bits */
> +			dso->text_offset = section->vma - (u32)section->vma;
> +			dso->text_offset += (u32)bfd_asymbol_value(symbols[i]);
> +		} else {
> +			dso->text_offset = section->vma - section->filepos;
> +		}
> +	}
> +
>  	qsort(symbols, symbols_count, sizeof(asymbol *), bfd_symbols__cmpvalue);
>  
>  #ifdef bfd_get_section
> -- 
> 2.33.0

-- 

- Arnaldo

  reply	other threads:[~2021-09-09 20:28 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-09 19:26 [PATCH] perf symbol: Look for ImageBase in PE file to compute .text offset Remi Bernon
2021-09-09 20:27 ` Arnaldo Carvalho de Melo [this message]
2021-09-12  8:25   ` Rémi Bernon
2021-09-13 19:24     ` Arnaldo Carvalho de Melo
2021-09-13 20:37       ` Rémi Bernon

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=YTpuTiYzkTKbUM/l@kernel.org \
    --to=acme@kernel.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@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=rbernon@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.