42 lines
2 KiB
Diff
42 lines
2 KiB
Diff
From 4ae4592f1106e941023a5768d34c2381cc869631 Mon Sep 17 00:00:00 2001
|
|
From: "Frank Ch. Eigler" <fche@redhat.com>
|
|
Date: Wed, 21 Aug 2019 19:29:45 -0400
|
|
Subject: [PATCH] PR23879, PR24875: fix task-finder-vma on f29+
|
|
|
|
It was reported & rediscovered that some vma-dependent runtime
|
|
facilities have been broken: @vma() and *ubacktrace(). It turns out
|
|
that modern gcc/ld.so links/loads binaries in slightly different ways
|
|
than older toolchains. Specifically, the first page of ELF files is
|
|
now loaded only r--p instead of r-xp protection flags. The
|
|
_stp_vma_mmap_cb() routine now accepts the r--p case too. It now
|
|
ignores the flags entirely.
|
|
---
|
|
runtime/vma.c | 11 ++++++++---
|
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/runtime/vma.c b/runtime/vma.c
|
|
index 7021725d6..02f9bf849 100644
|
|
--- a/runtime/vma.c
|
|
+++ b/runtime/vma.c
|
|
@@ -157,10 +157,15 @@ static int _stp_vma_mmap_cb(struct stap_task_finder_target *tgt,
|
|
dbug_task_vma(1,
|
|
"mmap_cb: tsk %d:%d path %s, addr 0x%08lx, length 0x%08lx, offset 0x%lx, flags 0x%lx\n",
|
|
tsk->pid, tsk->tgid, path, addr, length, offset, vm_flags);
|
|
- // We are only interested in the first load of the whole module that
|
|
- // is executable. We register whether or not we know the module,
|
|
+
|
|
+ // We used to be only interested in the first load of the whole module that
|
|
+ // is executable. But with modern enough gcc/ld.so, executables are mapped
|
|
+ // in more small pieces (r--p,r-xp,rw-p, instead of r-xp, rw-p). To establish
|
|
+ // the virtual base address, we initially look for an offset=0 mapping.
|
|
+ //
|
|
+ // We register whether or not we know the module,
|
|
// so we can later lookup the name given an address for this task.
|
|
- if (path != NULL && offset == 0 && (vm_flags & VM_EXEC)
|
|
+ if (path != NULL && offset == 0
|
|
&& stap_find_vma_map_info(tsk, addr, NULL, NULL, NULL, NULL) != 0) {
|
|
for (i = 0; i < _stp_num_modules; i++) {
|
|
// PR20433: papering over possibility of NULL pointers
|
|
--
|
|
2.21.0
|
|
|