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; // falsedso__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; // falseIt 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; // falseDitto.
// check DT_FLAGS_1for (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. 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.
Thanks, Steve
/*
- We need to check if we have a .dynsym, so that we can handle the
- .plt, synthesizing its symbols, that aren't on the symtabs (be it
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 3fb5d146d9b1..33ea2596ce31 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h @@ -127,6 +127,7 @@ void dso__insert_symbol(struct dso *dso, struct symbol *sym); void dso__delete_symbol(struct dso *dso, struct symbol *sym); +bool dso__is_pie(struct dso *dso);
struct symbol *dso__find_symbol(struct dso *dso, u64 addr); struct symbol *dso__find_symbol_nocache(struct dso *dso, u64 addr); -- 2.25.1