summaryrefslogtreecommitdiffstats
path: root/runtime/sym.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/sym.c')
-rw-r--r--runtime/sym.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/runtime/sym.c b/runtime/sym.c
index 763af16d..3843a3a5 100644
--- a/runtime/sym.c
+++ b/runtime/sym.c
@@ -20,6 +20,50 @@
* @{
*/
+static const char * _stp_kallsyms_lookup (
+ unsigned long addr,
+ unsigned long *symbolsize,
+ unsigned long *offset,
+ char **modname,
+ char *namebuf)
+{
+ unsigned begin = 0;
+ unsigned end = stap_num_symbols;
+ /*const*/ struct stap_symbol* s;
+
+ /* binary search on index [begin,end) */
+ do {
+ unsigned mid = (begin + end) / 2;
+ if (addr < stap_symbols[mid].addr)
+ end = mid;
+ else
+ begin = mid;
+ } while (begin + 1 < end);
+ /* result index in $begin, guaranteed between [0,stap_num_symbols) */
+
+ s = & stap_symbols [begin];
+ if (addr < s->addr)
+ return NULL;
+ else {
+ if (offset) *offset = addr - s->addr;
+ if (modname) *modname = (char *) s->modname;
+ if (symbolsize) {
+ if ((begin + 1) < stap_num_symbols)
+ *symbolsize = stap_symbols[begin+1].addr - s->addr;
+ else
+ *symbolsize = 0;
+ // NB: This is only a heuristic. Sometimes there are large
+ // gaps between text areas of modules.
+ }
+ if (namebuf) {
+ strlcpy (namebuf, s->symbol, KSYM_NAME_LEN+1);
+ return namebuf;
+ }
+ else
+ return s->symbol;
+ }
+}
+
/** Write addresses symbolically into a String
* @param str String
* @param address The address to lookup.