diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-06-15 13:23:25 +0200 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-06-15 13:23:25 +0200 |
commit | 1e797a2b262191a3b96f167c1b99c71442300100 (patch) | |
tree | 1964882fc6e6251d6f2d63ce2a0c15368bd6bb43 /src | |
parent | b32dc7059fe323ed3d2c100e900d9250e31bc0b2 (diff) | |
download | latrace-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
Diffstat (limited to 'src')
-rw-r--r-- | src/audit.c | 3 | ||||
-rw-r--r-- | src/symbol.c | 29 |
2 files changed, 17 insertions, 15 deletions
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; } |