summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-06-15 13:23:25 +0200
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-06-15 13:23:25 +0200
commit1e797a2b262191a3b96f167c1b99c71442300100 (patch)
tree1964882fc6e6251d6f2d63ce2a0c15368bd6bb43
parentb32dc7059fe323ed3d2c100e900d9250e31bc0b2 (diff)
downloadlatrace-1e797a2b262191a3b96f167c1b99c71442300100.tar.gz
latrace-1e797a2b262191a3b96f167c1b99c71442300100.tar.xz
latrace-1e797a2b262191a3b96f167c1b99c71442300100.zip
global_symbol fix - proper tree management
fix global_symbols tree management - add only if we care about the symbol - make bind call dependent on the global_symbols variable
-rw-r--r--ChangeLog3
-rw-r--r--src/audit.c3
-rw-r--r--src/symbol.c29
3 files changed, 20 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 301f0d9..d455f1a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2011-06-15 Jiri Olsa <olsajiri@gmail.com>
+ * global_symbol fix - proper tree management
+
2011-06-02 Jiri Olsa <olsajiri@gmail.com>
* adding large file support
diff --git a/src/audit.c b/src/audit.c
index 0037c52..2d00c88 100644
--- a/src/audit.c
+++ b/src/audit.c
@@ -257,7 +257,8 @@ static unsigned int la_symbind(ElfW(Sym) *sym, const char *symname)
}
/* we are interested in this symbol */
- if (!(flags & LA_SYMB_NOPLTENTER))
+ if (lt_sh(&cfg, global_symbols) &&
+ !(flags & LA_SYMB_NOPLTENTER))
lt_symbol_bind(cfg.sh, (void*) sym->st_value, symname);
return flags;
diff --git a/src/symbol.c b/src/symbol.c
index 6f2e155..df7d169 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -95,6 +95,16 @@ struct lt_symbol* lt_symbol_bind(struct lt_config_shared *cfg,
struct lt_symbol *s = NULL;
void *val;
+ PRINT_VERBOSE(cfg, 1, "checking %s(%p)\n", name, ptr);
+
+ /* symbol already added */
+ s = lt_symbol_get(cfg, ptr, name);
+ if (s) {
+ PRINT_VERBOSE(cfg, 1, "found %s, ptr %p, sym %p\n",
+ name, sym->ptr, sym);
+ return s;
+ }
+
if (!sym) {
sym = malloc(sizeof(*sym));
if (!sym)
@@ -105,29 +115,20 @@ struct lt_symbol* lt_symbol_bind(struct lt_config_shared *cfg,
sym->ptr = ptr;
sym->name = name;
- PRINT_VERBOSE(cfg, 1, "checking %s(%p)\n", name, ptr);
+ /* do we care about this symbol? */
+ if (symbol_init(cfg, sym, name))
+ return NULL;
+ /* we do, let's add it */
val = tsearch((void *) sym, &root, compare);
if (!val)
return NULL;
+ /* symbol properly added */
s = (*(void**) val);
- /* symbol already in */
- if (s != sym) {
- PRINT_VERBOSE(cfg, 1, "found %s, ptr %p, sym %p\n",
- name, sym->ptr, sym);
- return s;
- }
-
PRINT_VERBOSE(cfg, 1, "added %s, ptr %p, sym %p\n",
name, sym->ptr, sym);
-
- /* not interesting symbol */
- if (symbol_init(cfg, sym, name))
- return NULL;
-
- /* symbol properly added */
sym = NULL;
return s;
}