|
@@ -10,6 +10,7 @@
|
|
|
#include "symbol.h"
|
|
|
#include "map.h"
|
|
|
#include "probe-event.h"
|
|
|
+#include "probe-file.h"
|
|
|
|
|
|
#ifdef HAVE_LIBELF_SUPPORT
|
|
|
bool elf__needs_adjust_symbols(GElf_Ehdr ehdr)
|
|
@@ -79,13 +80,18 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
|
|
|
* However, if the user specifies an offset, we fall back to using the
|
|
|
* GEP since all userspace applications (objdump/readelf) show function
|
|
|
* disassembly with offsets from the GEP.
|
|
|
- *
|
|
|
- * In addition, we shouldn't specify an offset for kretprobes.
|
|
|
*/
|
|
|
- if (pev->point.offset || (!pev->uprobes && pev->point.retprobe) ||
|
|
|
- !map || !sym)
|
|
|
+ if (pev->point.offset || !map || !sym)
|
|
|
return;
|
|
|
|
|
|
+ /* For kretprobes, add an offset only if the kernel supports it */
|
|
|
+ if (!pev->uprobes && pev->point.retprobe) {
|
|
|
+#ifdef HAVE_LIBELF_SUPPORT
|
|
|
+ if (!kretprobe_offset_is_supported())
|
|
|
+#endif
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
lep_offset = PPC64_LOCAL_ENTRY_OFFSET(sym->arch_sym);
|
|
|
|
|
|
if (map->dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS)
|