summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/ChangeLog5
-rw-r--r--runtime/sym.h7
-rw-r--r--runtime/unwind.c6
3 files changed, 14 insertions, 4 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog
index 6ff15b8a..2438ee5e 100644
--- a/runtime/ChangeLog
+++ b/runtime/ChangeLog
@@ -1,5 +1,10 @@
2008-09-10 Mark Wielaard <mjw@redhat.com>
+ * sym.h (_stp_module): Rename module_base to dwarf_module_base.
+ * unwind.c (adjustStartLoc): Document and use dwarf_module_base.
+
+2008-09-10 Mark Wielaard <mjw@redhat.com>
+
* runtime.h (CONFIG_FRAME_POINTER): Don't enable when
STP_USE_DWARF_UNWINDER is already defined.
diff --git a/runtime/sym.h b/runtime/sym.h
index 564f4eb2..5888d2c7 100644
--- a/runtime/sym.h
+++ b/runtime/sym.h
@@ -33,8 +33,11 @@ struct _stp_module {
/* any notifier hooks that will tell us when a module */
/* is unloading. */
unsigned long module; /* XXX: why not struct module * ? */
-
- unsigned long module_base;
+
+ /* This is to undo .debug_frame relocation performed by elfutils, */
+ /* which is done during the translate phase when we encode the */
+ /* unwind data into the module. See adjustStartLoc() in unwind.c. */
+ unsigned long dwarf_module_base;
/* the stack unwind data for this module */
void *unwind_data;
diff --git a/runtime/unwind.c b/runtime/unwind.c
index db8ae664..bc8a93dc 100644
--- a/runtime/unwind.c
+++ b/runtime/unwind.c
@@ -550,7 +550,9 @@ static int processCFI(const u8 *start, const u8 *end, unsigned long targetLoc, s
return result && ptr.p8 == end && (targetLoc == 0 || state->label == NULL);
}
-// This is an address inside a module, adjust.
+// If this is an address inside a module, adjust for section relocation
+// and the elfutils base relocation done during loading of the .dwarf_frame
+// in translate.cxx.
static unsigned long
adjustStartLoc (unsigned long startLoc,
struct _stp_module *m,
@@ -560,7 +562,7 @@ adjustStartLoc (unsigned long startLoc,
{
startLoc = _stp_module_relocate (m->name, s->name,
startLoc);
- startLoc -= m->module_base;
+ startLoc -= m->dwarf_module_base;
}
return startLoc;
}