perf probe ppc64le: Fix ppc64 ABIv2 symbol decoding
ppc64 ELF ABIv2 has a Global Entry Point (GEP) and a Local Entry Point (LEP). For purposes of probing, we need the LEP - the offset to which is encoded in st_other. Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Reviewed-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Cc: linuxppc-dev@lists.ozlabs.org Link: http://lkml.kernel.org/r/ab9cc5e2b9de4cbaaf50f6ef2346a6a81100bad1.1430217967.git.naveen.n.rao@linux.vnet.ibm.com Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
031b84c407
Коммит
c50fc0a43e
|
@ -17,6 +17,13 @@ bool elf__needs_adjust_symbols(GElf_Ehdr ehdr)
|
|||
ehdr.e_type == ET_REL ||
|
||||
ehdr.e_type == ET_DYN;
|
||||
}
|
||||
|
||||
#if defined(_CALL_ELF) && _CALL_ELF == 2
|
||||
void arch__elf_sym_adjust(GElf_Sym *sym)
|
||||
{
|
||||
sym->st_value += PPC64_LOCAL_ENTRY_OFFSET(sym->st_other);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(_CALL_ELF) || _CALL_ELF != 2
|
||||
|
|
|
@ -775,6 +775,8 @@ static bool want_demangle(bool is_kernel_sym)
|
|||
return is_kernel_sym ? symbol_conf.demangle_kernel : symbol_conf.demangle;
|
||||
}
|
||||
|
||||
void __weak arch__elf_sym_adjust(GElf_Sym *sym __maybe_unused) { }
|
||||
|
||||
int dso__load_sym(struct dso *dso, struct map *map,
|
||||
struct symsrc *syms_ss, struct symsrc *runtime_ss,
|
||||
symbol_filter_t filter, int kmodule)
|
||||
|
@ -939,6 +941,8 @@ int dso__load_sym(struct dso *dso, struct map *map,
|
|||
(sym.st_value & 1))
|
||||
--sym.st_value;
|
||||
|
||||
arch__elf_sym_adjust(&sym);
|
||||
|
||||
if (dso->kernel || kmodule) {
|
||||
char dso_name[PATH_MAX];
|
||||
|
||||
|
|
|
@ -305,6 +305,7 @@ int setup_intlist(struct intlist **list, const char *list_str,
|
|||
|
||||
#ifdef HAVE_LIBELF_SUPPORT
|
||||
bool elf__needs_adjust_symbols(GElf_Ehdr ehdr);
|
||||
void arch__elf_sym_adjust(GElf_Sym *sym);
|
||||
#endif
|
||||
|
||||
#define SYMBOL_A 0
|
||||
|
|
Загрузка…
Ссылка в новой задаче