Merge new symbols properly with the symbols already in the library
diff --git a/ltrace-elf.c b/ltrace-elf.c
index e20c2de..cd88581 100644
--- a/ltrace-elf.c
+++ b/ltrace-elf.c
@@ -619,6 +619,13 @@
return sym_key->addr != sym_val->addr;
}
+static enum callback_status
+symbol_with_address(struct library_symbol *sym, void *addrptr)
+{
+ return sym->enter_addr == *(arch_addr_t *)addrptr
+ ? CBS_STOP : CBS_CONT;
+}
+
static int
populate_this_symtab(struct Process *proc, const char *filename,
struct ltelf *lte, struct library *lib,
@@ -767,13 +774,26 @@
}
}
+ /* Now we do the union of this set of unique symbols with
+ * what's already in the library. */
for (i = 0; i < num_symbols; ++i) {
- assert(symbols[i].libsym != NULL);
- library_add_symbol(lib, symbols[i].libsym);
+ struct library_symbol *this_sym = symbols[i].libsym;
+ assert(this_sym != NULL);
+ struct library_symbol *other
+ = library_each_symbol(lib, NULL, symbol_with_address,
+ &this_sym->enter_addr);
+ if (other != NULL) {
+ library_symbol_destroy(this_sym);
+ free(this_sym);
+ symbols[i].libsym = NULL;
+ }
}
- free(symbols);
+ for (i = 0; i < num_symbols; ++i)
+ if (symbols[i].libsym != NULL)
+ library_add_symbol(lib, symbols[i].libsym);
+ free(symbols);
return 0;
}