Commit 78625ce6 by Alexander Monakov Committed by Alexander Monakov

elf.c (elf_syminfo): Loop over the elf_syminfo_data chain.

	* elf.c (elf_syminfo): Loop over the elf_syminfo_data chain.

From-SVN: r201159
parent 0153887c
2013-07-23 Alexander Monakov <amonakov@ispras.ru> 2013-07-23 Alexander Monakov <amonakov@ispras.ru>
* elf.c (elf_syminfo): Loop over the elf_syminfo_data chain.
2013-07-23 Alexander Monakov <amonakov@ispras.ru>
* elf.c (backtrace_initialize): Pass elf_fileline_fn to * elf.c (backtrace_initialize): Pass elf_fileline_fn to
dl_iterate_phdr callbacks. dl_iterate_phdr callbacks.
......
...@@ -454,12 +454,46 @@ elf_syminfo (struct backtrace_state *state, uintptr_t pc, ...@@ -454,12 +454,46 @@ elf_syminfo (struct backtrace_state *state, uintptr_t pc,
void *data) void *data)
{ {
struct elf_syminfo_data *edata; struct elf_syminfo_data *edata;
struct elf_symbol *sym; struct elf_symbol *sym = NULL;
if (!state->threaded)
{
for (edata = (struct elf_syminfo_data *) state->syminfo_data;
edata != NULL;
edata = edata->next)
{
sym = ((struct elf_symbol *)
bsearch (&pc, edata->symbols, edata->count,
sizeof (struct elf_symbol), elf_symbol_search));
if (sym != NULL)
break;
}
}
else
{
struct elf_syminfo_data **pp;
pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
while (1)
{
edata = *pp;
/* Atomic load. */
while (!__sync_bool_compare_and_swap (pp, edata, edata))
edata = *pp;
if (edata == NULL)
break;
sym = ((struct elf_symbol *)
bsearch (&pc, edata->symbols, edata->count,
sizeof (struct elf_symbol), elf_symbol_search));
if (sym != NULL)
break;
pp = &edata->next;
}
}
edata = (struct elf_syminfo_data *) state->syminfo_data;
sym = ((struct elf_symbol *)
bsearch (&pc, edata->symbols, edata->count,
sizeof (struct elf_symbol), elf_symbol_search));
if (sym == NULL) if (sym == NULL)
callback (data, pc, NULL, 0); callback (data, pc, NULL, 0);
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment