make dladdr consistently produce the first symbol in presence of aliases
authorRich Felker <dalias@aerifal.cx>
Thu, 28 Jun 2018 16:07:51 +0000 (12:07 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 28 Jun 2018 16:07:51 +0000 (12:07 -0400)
the early-exit condition for the symbol match loop on exact matches
caused dladdr to produce the first match for an exact match, but the
last match for an inexact match. in the interest of consistency,
require a strictly-closer match to replace an already-found one.

ldso/dynlink.c

index d963aeab1cc688bb253bcbeaa4f1446f3a5faa54..a773b7825eb6266d943f516b3dedb4b4ee40c823 100644 (file)
@@ -1978,7 +1978,7 @@ int dladdr(const void *addr_arg, Dl_info *info)
                 && (1<<(sym->st_info&0xf) & OK_TYPES)
                 && (1<<(sym->st_info>>4) & OK_BINDS)) {
                        size_t symaddr = (size_t)laddr(p, sym->st_value);
-                       if (symaddr > addr || symaddr < best)
+                       if (symaddr > addr || symaddr <= best)
                                continue;
                        best = symaddr;
                        bestsym = sym;