提交 c8b49b2f 编写于 作者: R Rich Felker

fix symtab-order-dependent spurious matches in dladdr

commit 8b8fb7f0 added logic to prevent
matching a symbol with no recorded size (closest-match) when there is
an intervening symbol whose size was recorded, but it only worked when
the intervening symbol was encountered later in the search.

instead of rejecting symbols where addr falls outside their recorded
size during the closest-match search, accept them to find the true
closest-match, then reject such a result only once the search has
finished.
上级 8b8fb7f0
...@@ -1951,6 +1951,7 @@ int dladdr(const void *addr_arg, Dl_info *info) ...@@ -1951,6 +1951,7 @@ int dladdr(const void *addr_arg, Dl_info *info)
uint32_t nsym; uint32_t nsym;
char *strings; char *strings;
size_t best = 0; size_t best = 0;
size_t besterr = -1;
pthread_rwlock_rdlock(&lock); pthread_rwlock_rdlock(&lock);
p = addr2dso(addr); p = addr2dso(addr);
...@@ -1968,6 +1969,7 @@ int dladdr(const void *addr_arg, Dl_info *info) ...@@ -1968,6 +1969,7 @@ int dladdr(const void *addr_arg, Dl_info *info)
if (idx < nsym && (sym[idx].st_info&0xf) == STT_FUNC) { if (idx < nsym && (sym[idx].st_info&0xf) == STT_FUNC) {
best = (size_t)(p->funcdescs + idx); best = (size_t)(p->funcdescs + idx);
bestsym = sym + idx; bestsym = sym + idx;
besterr = 0;
} }
} }
...@@ -1978,18 +1980,19 @@ int dladdr(const void *addr_arg, Dl_info *info) ...@@ -1978,18 +1980,19 @@ int dladdr(const void *addr_arg, Dl_info *info)
size_t symaddr = (size_t)laddr(p, sym->st_value); size_t symaddr = (size_t)laddr(p, sym->st_value);
if (symaddr > addr || symaddr < best) if (symaddr > addr || symaddr < best)
continue; continue;
if (sym->st_size && symaddr+sym->st_size <= addr) {
best = 0;
bestsym = 0;
continue;
}
best = symaddr; best = symaddr;
bestsym = sym; bestsym = sym;
besterr = addr - symaddr;
if (addr == symaddr) if (addr == symaddr)
break; break;
} }
} }
if (bestsym && besterr > bestsym->st_size-1) {
best = 0;
bestsym = 0;
}
info->dli_fname = p->name; info->dli_fname = p->name;
info->dli_fbase = p->map; info->dli_fbase = p->map;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册