cc: Implement `bcc_resolve_global_addr` helper
authorVicent Marti <tanoku@gmail.com>
Sun, 1 May 2016 10:52:46 +0000 (12:52 +0200)
committerVicent Marti <tanoku@gmail.com>
Fri, 6 May 2016 08:54:50 +0000 (10:54 +0200)
src/cc/bcc_syms.cc
src/cc/bcc_syms.h

index b656893..005ec61 100644 (file)
@@ -199,6 +199,32 @@ void bcc_symcache_refresh(void *resolver) {
   cache->refresh();
 }
 
+struct mod_st {
+  const char *name;
+  uint64_t start;
+};
+
+static int _find_module(const char *modname, uint64_t start, uint64_t end,
+    void *p) {
+  struct mod_st *mod = (struct mod_st *)p;
+  if (!strcmp(modname, mod->name)) {
+    mod->start = start;
+    return -1;
+  }
+  return 0;
+}
+
+int bcc_resolve_global_addr(int pid, const char *module, const uint64_t address,
+                           uint64_t *global) {
+  struct mod_st mod = {module, 0x0};
+  if (bcc_procutils_each_module(pid, _find_module, &mod) < 0 ||
+      mod.start == 0x0)
+    return -1;
+
+  *global = mod.start + address;
+  return 0;
+}
+
 static int _find_sym(const char *symname, uint64_t addr, uint64_t end,
                      int flags, void *payload) {
   struct bcc_symbol *sym = (struct bcc_symbol *)payload;
index d82054a..41e57f2 100644 (file)
@@ -33,6 +33,8 @@ int bcc_symcache_resolve(void *symcache, uint64_t addr, struct bcc_symbol *sym);
 int bcc_symcache_resolve_name(void *resolver, const char *name, uint64_t *addr);
 void bcc_symcache_refresh(void *resolver);
 
+int bcc_resolve_global_addr(int pid, const char *module, const uint64_t address,
+                           uint64_t *global);
 int bcc_find_symbol_addr(struct bcc_symbol *sym);
 int bcc_resolve_symname(const char *module, const char *symname,
                         const uint64_t addr, struct bcc_symbol *sym);