summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dwflpp.cxx11
1 files changed, 7 insertions, 4 deletions
diff --git a/dwflpp.cxx b/dwflpp.cxx
index 35637568..53f3d8eb 100644
--- a/dwflpp.cxx
+++ b/dwflpp.cxx
@@ -1484,8 +1484,8 @@ dwflpp::emit_address (struct obstack *pool, Dwarf_Addr address)
{
// This gives us the module name, and section name within the
// module, for a kernel module (or other ET_REL module object).
- obstack_printf (pool, "({ static unsigned long addr = 0; ");
- obstack_printf (pool, "if (addr==0) addr = _stp_module_relocate (\"%s\",\"%s\",%#" PRIx64 "); ",
+ obstack_printf (pool, "({ unsigned long addr = 0; ");
+ obstack_printf (pool, "addr = _stp_module_relocate (\"%s\",\"%s\",%#" PRIx64 "); ",
modname, secname, reloc_address);
obstack_printf (pool, "addr; })");
}
@@ -1495,6 +1495,9 @@ dwflpp::emit_address (struct obstack *pool, Dwarf_Addr address)
// need to treat the same way here as dwarf_query::add_probe_point does: _stext.
address -= sess.sym_stext;
secname = "_stext";
+ // Note we "cache" the result here through a static because the
+ // kernel will never move after being loaded (unlike modules and
+ // user-space dynamic share libraries).
obstack_printf (pool, "({ static unsigned long addr = 0; ");
obstack_printf (pool, "if (addr==0) addr = _stp_module_relocate (\"%s\",\"%s\",%#" PRIx64 "); ",
modname, secname, address); // PR10000 NB: not reloc_address
@@ -1503,8 +1506,8 @@ dwflpp::emit_address (struct obstack *pool, Dwarf_Addr address)
else
{
enable_task_finder (sess);
- obstack_printf (pool, "({ static unsigned long addr = 0; ");
- obstack_printf (pool, "if (addr==0) addr = _stp_module_relocate (\"%s\",\"%s\",%#" PRIx64 "); ",
+ obstack_printf (pool, "({ unsigned long addr = 0; ");
+ obstack_printf (pool, "addr = _stp_module_relocate (\"%s\",\"%s\",%#" PRIx64 "); ",
modname, ".dynamic", reloc_address);
obstack_printf (pool, "addr; })");
}