linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Leo Yan <leo.yan@arm.com>
To: scclevenger@os.amperecomputing.com, james.clark@linaro.org,
	mike.leach@linaro.org
Cc: suzuki.poulose@arm.com, ilkka@os.amperecomputing.com,
	coresight@lists.linaro.org, linux-perf-users@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH V4 1/4] Add dso__is_pie call to identify ELF PIE
Date: Wed, 28 Aug 2024 21:36:12 +0100	[thread overview]
Message-ID: <b671a11e-5a6c-476c-85e8-22f629e39129@arm.com> (raw)
In-Reply-To: <ce98443a-e79d-4f92-b0cf-4e6603928bbc@os.amperecomputing.com>

On 8/28/2024 4:48 PM, Steve Clevenger wrote:
> 
> On 8/28/2024 1:23 AM, Leo Yan wrote:
>> On 8/28/2024 6:09 AM, Steve Clevenger wrote:
>>>
>>> Add dso__is_pie global to read the .dynamic section DT_FLAGS_1 entry for
>>> the DF_1_PIE flag. This identifies position executable code.
>>>
>>> Signed-off-by: Steve Clevenger <scclevenger@os.amperecomputing.com>
>>> ---
>>>  tools/perf/util/symbol-elf.c | 60 ++++++++++++++++++++++++++++++++++++
>>>  tools/perf/util/symbol.h     |  1 +
>>>  2 files changed, 61 insertions(+)
>>>
>>> diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
>>> index e398abfd13a0..0e49c1345a67 100644
>>> --- a/tools/perf/util/symbol-elf.c
>>> +++ b/tools/perf/util/symbol-elf.c
>>> @@ -662,6 +662,66 @@ static int dso__synthesize_plt_got_symbols(struct dso *dso, Elf *elf,
>>>         return err;
>>>  }
>>>
>>> +/*
>>> + * Check dynamic section DT_FLAGS_1 for a Position Independent
>>> + * Executable (PIE).
>>> + */
>>> +bool dso__is_pie(struct dso *dso)
>>> +{
>>> +       Elf *elf = NULL;
>>> +       Elf_Scn *scn = NULL;
>>> +       GElf_Ehdr ehdr;
>>> +       GElf_Shdr shdr;
>>> +       bool is_pie = false;
>>> +       char dso_path[PATH_MAX];
>>> +       int fd = -1;
>>> +
>>> +       if (!dso || (elf_version(EV_CURRENT) == EV_NONE))
>>> +               goto exit;      // false
>>> +
>>> +       dso__build_id_filename(dso, dso_path, sizeof(dso_path), false);
>>> +
>>> +       fd = open(dso_path, O_RDONLY);
>>> +
>>> +       if (fd < 0) {
>>> +               pr_debug("%s: cannot read cached %s.\n", __func__, dso_path);
>>> +               goto exit;      // false
>>> +       }
>>> +
>>> +       elf = elf_begin(fd, ELF_C_READ, NULL);
>>> +       gelf_getehdr(elf, &ehdr);
>>> +
>>> +       if (ehdr.e_type == ET_DYN) {
>>> +               Elf_Data *data;
>>> +               GElf_Dyn *entry;
>>> +               int n_entries = shdr.sh_size / sizeof(GElf_Dyn);
>>> +
>>> +               scn = elf_section_by_name(elf, &ehdr, &shdr, ".dynamic", NULL);
>>> +               if (!scn)
>>> +                       goto exit;      // false
>>
>> It should goto a new tag (e.g. exit_failed) so can invoke elf_end(elf) and
>> close(fd).
>>
>>> +
>>> +               data = (Elf_Data *) elf_getdata(scn, NULL);
>>> +               if (!data || !data->d_buf)
>>> +                       goto exit;      // false
>>
>> Ditto.
>>
>>> +
>>> +               // check DT_FLAGS_1
>>> +               for (int i = 0; i < n_entries; i++) {
>>> +                       entry = ((GElf_Dyn *) data->d_buf) + i;
>>> +                       if (entry->d_tag == DT_FLAGS_1) {
>>> +                               if ((entry->d_un.d_val & DF_1_PIE) != 0) {
>>> +                                       is_pie = true;
>>> +                                       break;
>>> +                               }
>>> +                       }
>>> +               } // end for
>>> +       }
>>> +
>>
>> Put 'exit_failed' tag at here.
>>
>> With the changes:
>>
>> Reviewed-by: Leo Yan <leo.yan@arm.com>
>>
>>> +       elf_end(elf);
>>> +       close(fd);
>>> +exit:
>>> +       return is_pie;
>>> +}
>>> +
> 
> Hi Leo,
> 
> It's been a long time since I've seen goto's used as a rule rather than
> an exception. I see it introduced the problem you've mentioned.

I am not sure if I understand this. In the Linux code, it is quite common to
use goto to handle failure cases (for releasing resources).

> Is it ok to simply update the cover letter (patch 0), and this one (patch 1)
> as V5? If I don't hear from you, I'll resubmit all.

I assume you also need to address patch 03? It is good to send the all patches
in one go, this would be easier for maintainers to pick up the whole series
(e.g. using b4).

Thanks,
Leo

      parent reply	other threads:[~2024-08-28 20:36 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-28  5:09 [PATCH V4 0/4] arm-cs-trace-disasm.py/perf must accommodate non-zero DSO text offset Steve Clevenger
2024-08-28  5:09 ` [PATCH V4 4/4] Adjust objdump start/end range per map pgoff parameter Steve Clevenger
2024-08-28  8:46   ` Leo Yan
2024-08-28  5:09 ` [PATCH V4 3/4] Add map pgoff to python dictionary based on MAPPING_TYPE Steve Clevenger
2024-08-28  8:44   ` Leo Yan
2024-08-28 21:26     ` Steve Clevenger
2024-08-28  5:09 ` [PATCH V4 2/4] Force MAPPING_TYPE__IDENTIY for PIE Steve Clevenger
2024-08-28  8:26   ` Leo Yan
2024-08-28  5:09 ` [PATCH V4 1/4] Add dso__is_pie call to identify ELF PIE Steve Clevenger
2024-08-28  8:23   ` Leo Yan
2024-08-28 15:48     ` Steve Clevenger
2024-08-28 20:34       ` Leo Yan
2024-08-28 20:36       ` Leo Yan [this message]

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=b671a11e-5a6c-476c-85e8-22f629e39129@arm.com \
    --to=leo.yan@arm.com \
    --cc=coresight@lists.linaro.org \
    --cc=ilkka@os.amperecomputing.com \
    --cc=james.clark@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mike.leach@linaro.org \
    --cc=scclevenger@os.amperecomputing.com \
    --cc=suzuki.poulose@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).