Message ID | 1421902378-3634-2-git-send-email-victor.kamensky@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jan 21, 2015 at 08:52:56PM -0800, Victor Kamensky wrote: > Aarch64 ELF files use mapping symbols with special names $x, $d > to identify regions of Aarch64 code (see Aarch64 ELF ABI - "ARM > IHI 0056B", section "4.5.4 Mapping symbols"). > > The patch filters out these symbols at load time, similar to > "696b97a perf symbols: Ignore mapping symbols on ARM" changes > done for ARM before V8. I thought I'd commented that this should probably use the same test that we already have established elsewhere in the kernel, namely in the kallsyms and module code: /* * This ignores the intensely annoying "mapping symbols" found * in ARM ELF files: $a, $t and $d. */ static inline int is_arm_mapping_symbol(const char *str) { return str[0] == '$' && strchr("axtd", str[1]) && (str[2] == '\0' || str[2] == '.'); } We really shouldn't be writing the same check for the same symbols in different ways.
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index 06fcd1b..1e188dd 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -862,6 +862,14 @@ int dso__load_sym(struct dso *dso, struct map *map, !strcmp(elf_name, "$t")) continue; } + /* Reject Aarch64 ELF "mapping symbols": these aren't unique and + * don't identify functions, so will confuse the profile + * output: */ + if (ehdr.e_machine == EM_AARCH64) { + if (!strcmp(elf_name, "$x") || + !strcmp(elf_name, "$d")) + continue; + } if (runtime_ss->opdsec && sym.st_shndx == runtime_ss->opdidx) { u32 offset = sym.st_value - syms_ss->opdshdr.sh_addr;